我正在学习正则表达式,并运行到在实施麻烦。
我发现Java教程的RegexTestHarness
,并运行它,下面的字符串正确识别我的模式:
[\d|\s][\d]\.
(我的图案是任何两位数,或一个空格,后跟一个句点前面的任何单个数字。)
该字符串是通过该线路码获得:
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
当我尝试写在Eclipse中一个简单的类,它告诉我的转义序列是无效的,而且将无法编译,除非我改变字符串:
[\\d|\\s][\\d]\\.
在我的课,我using`Pattern pattern = Pattern.compile();
当我把这个字符串回到TestHarness
没有找到正确的匹配。
有人能告诉我哪一个是正确的?在从console.readLine()
一些格式的区别?
\
是在字符串"..."
特殊字符。它是用来逃脱其它特殊字符,或者创建类似\n
\r
\t
字符。
要在字符串字面量\
字符可以在正则表达式引擎使用您需要通过添加之前另一\
(就像你在正则表达式做的时候,你需要逃脱它的元字符像点\.
),以逃避它。所以字符串代表\
看起来像"\\"
。
当您从用户读取数据这个问题不存在,因为您已经阅读文字,这样即使用户将在控制台\n
它会被解释成两个字符\
和n
写。
也有是在加入阶级性|
内[...]
没有意义,除非你的意图是使类还匹配|
字符,请记住,[abc]
是一样的(a|b|c)
所以没有必要在|
"[\\d|\\s]"
。
如果你想表示一个Java字符串字面反斜杠,你需要用一个反斜杠逃逸,所以字符串文字"\\s"
是两个字符,\
和s
。这意味着,代表在Java字符串文字,你会使用[\d\s][\d]\.
正则表达式"[\\d\\s][\\d]\\."
。
请注意,我还做了少许修改你的正则表达式,[\d|\s]
将匹配一个数字,空格或文字|
字符。你只是想[\d\s]
。字符类已经表示“符合其中之一”,因为你不需要它失去了它的特殊含义的字符类中的交替的|
。
我的图案是任何两位数或一个空格,后跟一个句点前面单个数字。)
正确的正则表达式为:
Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\.");
此外,如果你要根据用户输入的正则表达式的字符串,然后您应该拨打:
Pattern.quote(useInputRegex);
为了逃避所有的正则表达式的特殊字符。
你也是双逃脱,因为1个逃生由String类的处理,第二一个被传递给正则表达式引擎。
正在发生的事情是,转义序列被两次评估。一旦对于Java,然后一旦你的正则表达式。
其结果是,你需要躲避转义字符,当你使用正则表达式转义序列。
举例来说,如果你需要一个数字,你会使用
"\\d"