RegEx的引号与Java中的任何内容都不匹配

时间:2014-10-23 15:20:10

标签: java regex

我可以使用以下示例字符串之一:

Apple $Banana Kiwi

Apple $Banana, Kiwi

Apple $Banana. Kiwi

我需要找到litesrally" $ Banana"

在java 6中,我使用了这个:

String quotedStringToFind=Pattern.quote(stringTofind);

我还需要找到完整的单词,所以我尝试了这个:

Pattern.compile("\\b"+quotedStringToFind+"\\b");

没有任何匹配。 RegEx在语法上是正确的。我无法理解它为什么不起作用。

2 个答案:

答案 0 :(得分:1)

一些问题:

  • $是一个保留字符,意思是“字符串的结尾”。您需要首先转义任何保留字符(\^$.|?*+()[{),或者使用{Reiumeus的答案中的Pattern.LITERAL编译表达式。
  • 空格与$中的Apple $Banana之间没有字边界,因为它们都是非字字符。假设您希望在stringTofind之前或之后有空格,您可以使用这样的表达式:(?<=\\s|^)\\$Banana(?=\\s|$)(请注意,这不适用于Pattern.LITERAL,因为它不会'唤醒外观)。

答案 1 :(得分:-3)

Definition of word boundary

  

[...]它匹配一个名为&#34;字边界的位置&#34;。这个匹配是零长度。

     

有三种不同的职位符合词边界:

     
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

鉴于

  

Apple $Banana Kiwi

第一个场景失败,因为$不是单词字符。所以在字符串中的第一个字符之前不能匹配。

您可以使用空格来分隔$Banana

Pattern pattern = Pattern.compile("\\s" + quotedStringToFind + "\\s");