我正在阅读List<String>
的字符串列表。字符串看起来像这样:
blah1
blah2
blah3
blah4
在java中,我想构建一个正则表达式来检查类似于(myString/|yourString)
的模式,并将其连接到上面列表中的每个字符串,同时对文件的行进行模式匹配。
所以我这样做(下面的代码只是snippits):
String pattern = "(myString/|yourString.)"
private String listAsString;
private void createListAsStrings() {
StringBuilder sb = new StringBuilder();
for(String string : stringList) {
sb.append(string + "|"); # using the pipe hoping it will do an OR in the regex
}
listAsString = sb.toString();
}
要构建模式,我正在尝试执行以下操作:
Pattern p = Pattern.compile(pattern + listAsString);
但是当我开始运行匹配器时,它不会遍历我的stringbuilder的字符串列表中的每个字符串。然后最后一个问题是我的最后一个字符串将包含|
。
有没有办法匹配myString/blah1
或yourString.blah1
或myString/blah2
等..使用正则表达式对文件中的每一行?
有很多代码,所以我刚发布了相似的内容。
答案 0 :(得分:2)
您要构建的表达式应如下所示:
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 + ")";
答案 1 :(得分:0)
我认为基本问题是你的模式(忽略尾随问题)就像是
(myString/|yourString.)blah1|blah2|blah3
将匹配其中一个
myString/blah1
yourString.blah1
blah2
blah3
这就是运算符优先级在正则表达式中的工作原理。您需要在文件的行周围添加一组额外的括号(另请参阅有关\ Q .. \ E的其他答案,并避免字符串末尾的栏)。