Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有引号的正则表达式在Java中不匹配任何内容_Java_Regex - Fatal编程技术网

带有引号的正则表达式在Java中不匹配任何内容

带有引号的正则表达式在Java中不匹配任何内容,java,regex,Java,Regex,我可以使用以下示例字符串之一: Apple $Banana Kiwi Apple $Banana, Kiwi Apple $Banana. Kiwi 我需要随便找“香蕉美元” 在java 6中,我使用了以下方法: String quotedStringToFind=Pattern.quote(stringTofind); 我还需要找到完整的单词,因此我尝试了以下方法: Pattern.compile("\\b"+quotedStringToFind+"\\b"); 没有匹配的。正则表达

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

Apple $Banana Kiwi

Apple $Banana, Kiwi

Apple $Banana. Kiwi
我需要随便找“香蕉美元”

在java 6中,我使用了以下方法:

String quotedStringToFind=Pattern.quote(stringTofind);
我还需要找到完整的单词,因此我尝试了以下方法:

Pattern.compile("\\b"+quotedStringToFind+"\\b");
没有匹配的。正则表达式在语法上是正确的。我不明白它为什么不工作。

有几个问题:

  • $
    是一个保留字符,表示“字符串结尾”。您需要首先转义任何保留字符(
    \^$.|?*+()[{
    ),或者像@Reiumeus的答案一样使用
    Pattern.LITERAL
    编译表达式
  • Apple$Banana
    中,空格和
    $
    之间没有单词边界,因为它们都是非单词字符。如果希望在
    stringTofind
    之前或之后有空格,可以使用如下表达式:(请注意,这不适用于
    Pattern.LITERAL
    ,因为它不会评估lookarounds)

[…]它在一个称为“字边界”的位置匹配。此匹配为零长度

有三种不同的位置可以作为单词边界:

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

Apple$香蕉猕猴桃

第一种方案失败,因为
$
不是单词字符。因此字符串中的第一个字符前面不能有匹配项

根据您在其他地方的评论,您不希望匹配字符串,如
“$Bananayellow”
,因此我们可以假设您希望文本
“$Banana”
以单词字符以外的字符结尾

正如Tim在中所建议的,可以使用正则表达式
(?。该表达式将检查
$Banana
前面是否有非空白字符,后面是否有单词边界

比如说,

List<String> testStrings = List.of("Apple $Banana Kiwi",
                                   "Apple $Banana, Kiwi",
                                   "Apple $Banana. Kiwi",
                                   "Apple $Bananayellow. Kiwi");

// need to escape the special `$` character
Pattern pattern = Pattern.compile("(?<!\\S)\\$Banana\\b");

for (String testString : testStrings) {
    Matcher matcher = pattern.matcher(testString);
    if (!matcher.find()) {
        System.out.println("failed to find pattern in string " + testString);
    }
}
List testStrings=List.of(“苹果$香蕉猕猴桃”,
“苹果$香蕉,猕猴桃”,
“苹果香蕉猕猴桃”,
“苹果$Bananayellow.Kiwi”);
//需要转义特殊的“$”字符

Pattern Pattern=Pattern.compile(“(?您需要知道输入中是否包含“$Banana”,还是要提取中间的单词?@Bohemian我不认为OP知道单词是
$Banana
,因为变量名为
stringTofind
@Sotirios正则表达式课程继续:
(?不仅声明前面的空格,还声明字符串的开头。理想情况下,当模式恰好是第一个时,您希望模式也匹配
$Banana