有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何对多个字符串使用带有模式匹配器的正则表达式?

我正在读一个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);

但是当我开始运行matcher时,它不会遍历stringbuilder中字符串列表中的每个字符串。最后一个问题是,我的最后一个字符串将包含一个|

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    哪一个和其中一个匹配

    myString/blah1
    yourString.blah1
    blah2
    blah3
    

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

  2. # 2 楼答案

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

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

    如果字符串包含regex元字符,则需要将字符串blah1blah2等包装在\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 + ")";