Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我正在从列表中读取字符串列表。字符串如下所示: blah1 blah2 blah3 blah4 在java中,我想构建一个正则表达式来检查像这样的模式(myString/| yourString),并将其连接到上面列表中的每个字符串,同时对文件行进行模式匹配 所以我这样做了(下面的代码只是剪贴画): 要构建模式,我将尝试执行以下操作: Pattern p = Pattern.compile(pattern + listAsString); 但是当我开始运行matcher时,它不会遍历stri

我正在从
列表
中读取字符串列表。字符串如下所示:

blah1
blah2
blah3
blah4
在java中,我想构建一个正则表达式来检查像这样的模式
(myString/| yourString)
,并将其连接到上面列表中的每个字符串,同时对文件行进行模式匹配

所以我这样做了(下面的代码只是剪贴画):

要构建模式,我将尝试执行以下操作:

Pattern p = Pattern.compile(pattern + listAsString);
但是当我开始运行matcher时,它不会遍历stringbuilder中字符串列表中的每个字符串。最后一个问题是,我的最后一个字符串将包含一个
|

是否有方法匹配
myString/blah1
yourString.blah1
myString/blah2
等。。对文件中的每一行使用正则表达式


有很多代码,所以我刚刚发布了一些似乎相关的内容。

您希望构建的表达式应该如下所示:

myString/(?:\Qblah1\E|\Qblah2\E)
如果字符串包含regex元字符,则需要将字符串
blah1
blah2
等包装在
\Q
-
\E
中。要修复前导
|
的添加,请使用一个布尔变量,指示这是否是循环的第一次迭代:

StringBuilder sb = new StringBuilder();
boolean isFirst = true;
for(String word : stringList) {
    if (!isFirst) {
        sb.append('|');
    } else {
        isFirst = false;
    }
    sb.append("\\Q");
    sb.append(word);
    sb.append("\\E");
}
String regex = "myString/" + "(?:" + sb + ")";

我认为最基本的问题是你的模式(忽略尾随问题)是这样的

(myString/|yourString.)blah1|blah2|blah3 
哪一个会匹配其中一个

myString/blah1
yourString.blah1
blah2
blah3

这就是正则表达式中运算符优先级的工作方式。您需要在文件中的行周围加上一组括号(另外请参阅关于\Q..\E的其他答案,并避免使用字符串末尾的横条).

应该注意,
\Q...E
是Java 6+only@fge这很奇怪:Oracle的文档在中提到了
\Q
..
\E
。@dasblinkenlight您能解释一下regex中的
?:
吗?@nkon
(?:regex)
使
regex
成为非捕获组。您需要一个组来避免多次添加
myString/
。除非您想检索与
regex
匹配的值,否则您可以使用
?:
使组不可捕获。感谢您在这方面提供的帮助。
myString/blah1
yourString.blah1
blah2
blah3