Java正则表达式和美元符号

时间:2010-10-04 08:40:26

标签: java regex

我有Java字符串:

String b = "/feedback/com.school.edu.domain.feedback.Review$0/feedbackId");

我也生成了一个模式,我想要匹配这个字符串:

String pattern = "/feedback/com.school.edu.domain.feedback.Review$0(.)*";

当我说b.matches(pattern)时,它会返回false。现在我知道美元符号是Java RegEx的一部分,但我不知道我的模式应该是什么样子。我假设$ in pattern需要被一些转义字符替换,但不知道有多少。这个$符号对我很重要,因为它有助于我区分列表中的元素(美元后的数字),我不能没有它。

5 个答案:

答案 0 :(得分:54)

使用

String escapedString = java.util.regex.Pattern.quote(myString)

到给定字符串中的automatically escape all special regex characters

答案 1 :(得分:29)

你需要使用反斜杠($)在正则表达式中转义\ ,但是反斜杠是字符串中的转义字符你需要逃避反斜杠本身。

您需要以相同的方式转义任何特殊的正则表达式字符,例如使用“。”。

String pattern = "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*";

答案 2 :(得分:7)

在Java正则表达式中,.$都很特殊。你需要用2个反斜杠来逃避它,即..

"/feedback/com\\.navtag\\.etc\\.Review\\$0(.*)"

(1个反斜杠用于Java字符串,1个用于正则表达式引擎。)

答案 3 :(得分:2)

\

逃脱美元
String pattern = 
  "/feedback/com.navteq.lcms.common.domain.poi.feedback.Review\\$0(.)*";

我建议你逃避..代表任何角色。

String pattern = 
  "/feedback/com\\.navteq\\.lcms\\.common\\.domain\\.poi\\.feedback\\.Review\\$0(.)*"; 

答案 4 :(得分:1)

@Colin Hebert编写并由@theon编辑的ans是正确的。解释如下。 @ azec-pdx

  1. 这是一个正则表达式,作为字符串文字(用双引号引起来)。

  2. 句点(。)和美元符号($)是特殊的正则表达式字符(元字符)。

  3. 要使正则表达式引擎将它们解释为普通的正则表达式字符period(。)和美元符号($),您需要在每个正斜杠前面加一个反斜杠。单个反斜杠(本身是一个特殊的正则表达式字符)将其后的字符引起来并对其进行转义。

  4. 由于给定的正则表达式是字符串文字,因此必须在每个前缀前面加上一个反斜杠,以免与通常的可见ASCII转义符(字符串文字中的字符,字符串和Unicode转义)混淆,从而避免了编译器错误。

  5. 即使您在字符串文字中使用任何已定义为转义序列的特殊正则表达式构造,也需要在其前加上另一个反斜杠,以避免编译器错误。例如,特殊regex构造(转义)正则表达式的\ b(单词边界)序列将与通常的可见ASCII转义(字符转义)的\ b(退格)发生冲突。因此,将另一个反斜杠作为前缀以避免冲突,然后\\ b将被正则表达式读取为单词边界。

  6. 为了始终安全起见,字符串文字中的所有单个反斜杠转义符(引号)均以另一个反斜杠作为前缀。例如,字符串文字“ \(hello \)”是非法的,并会导致编译时错误;为了匹配字符串(hello),必须使用字符串文字“ \\(hello \\)”。

  7. 应该将最后一个句点(。)*解释为特殊的正则表达式字符,因此它不需要用反斜杠引起引用,更不用说在第二个字符前加上前缀了。