1

我正在阅读来自List<String>. 字符串如下所示:

blah1
blah2
blah3
blah4

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

所以我这样做(下面的代码只是片段):

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);

但是当我开始运行匹配器时,它不会遍历我的字符串生成器中字符串列表中的每个字符串。然后最后一个问题是我的最后一个字符串将包含一个|.

有没有办法匹配myString/blah1yourString.blah1myString/blah2..对文件中的每一行使用正则表达式?

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

4

2 回答 2

2

您要构建的表达式应如下所示:

myString/(?:\Qblah1\E|\Qblah2\E)

您需要包装字符串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 + ")";
于 2013-07-08T16:25:04.793 回答
0

我认为基本问题是您的模式(忽略尾随 | 问题)类似于

(myString/|yourString.)blah1|blah2|blah3 

这将匹配其中之一

myString/blah1
yourString.blah1
blah2
blah3

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

于 2013-07-08T16:34:30.310 回答