java - 使用 Java 正则表达式查找多个字符串匹配

标签 java regex string

我正在尝试使用正则表达式来查找 Si(P)Si(I) 之间的字符串匹配项。

下面是我写的。为什么它不起作用以及如何修复它?

String Channel = "Si0/4(I) Si0/6( Si0/8K  Si0/5(P)";

if (Channel.length() > 0) {
    String pattern1 = "Si";
    String pattern2 = "(P)";
    String pattern3 = "(I)";

    String P1 = Pattern.quote(pattern1) + "(.*?)[" + Pattern.quote(pattern2) + "|" + Pattern.quote(pattern3) + "]";

    Pattern p = Pattern.compile(P1);
    Matcher m = p.matcher(Channel);

    while(m.find()){
        if (m.group(1)!= null)
        {
            System.out.println(m.group(1));
        }
        else if (m.group(2)!= null)
        {   
            System.out.println(m.group(2));
        }
    }

}

预期输出

0/4
0/5

实际输出

0/4
0/6
0/8K  Si0/5

最佳答案

在正则表达式中使用lookbehind和lookahead。并且您还需要在字符类中添加空格,这样就不会出现这个 0/8K 字符串。

(?<=Si)[^\\( ]*(?=\\((?:P|I)\\))

DEMO

String str="Si0/4(I) Si0/6( Si0/8K Si0/5(P)";
String regex="(?<=Si)[^\\( ]*(?=\\([PI]\\))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher =pattern.matcher(str);
while(matcher.find()){
    System.out.println(matcher.group(0));
}

输出:

0/4
0/5

关于java - 使用 Java 正则表达式查找多个字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25670401/

相关文章:

php - PHP中的iframe与来自SQL的字符串

java - 如何检查字符串是否以多个前缀之一开头?

.NET 正则表达式保留字符

位于 tomcat 库中的 Java keystore

java - 从重载类方法调用 super() 是否使用非参数化方法中的变量?

java - 我在使用 JDK1.8 的 HashMap 时遇到了一些问题

php - 使用一个正则表达式在多行注释中查找单词

php - 使用反引号(重音符)时字符串操作的规则是什么?

java - 哈希攻击 : find strings of length 2^N with same hashCode()

java - 在maven2构建中阻止EntityResolver使用互联网?