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