1

什么是匹配“>”或“|”模式的正确正则表达式 至少出现 3 次,如下例所示?我想匹配“>”或“|” (不是两者)在给定的文本中,中间有不规则的间距。

应该匹配

  • “a>b>c>d>e”

  • " a|b|c | d |e"

不应该匹配

  • “a>b>c”(只有 2 个“>”)

  • “ a|b>c | d |e”(不是“>”或“|”)

用于测试表达式的示例 Java 代码 (仅转义反斜杠)

public static void main(String[] args) {
    List<String> patterns = new ArrayList<String>();
    patterns.add("/((\\s*\\w+\\s*>\\s*){3,}|(\\s*\\w+s*\\|\\s*){3,})\\w/g");
    patterns.add("^( ([\\w\\s]*>){3,} | ([\\w\\s]*\\|){3,} )[\\w\\s]*$");
    patterns.add("/(>|\\|)[^>\\|]*\\1[^>\\|]*\\1/");
    patterns.add("/[\\w ]*([>|])(?:[\\w ]*\\1){2,}[\\w ]*/");

    List<String> test = new ArrayList<String>();
    test.add("a > b > c > d");
    test.add("a >b> c> d");
    test.add("a>b>c>d");
    test.add("a>b>c");

    for (String s : test) {
        for (int i = 0; i < patterns.size(); i++) {
            System.out.println(s + "[Pattern " + i + "] " + s.matches(patterns.get(i)));
        }
    }
}
4

4 回答 4

1
/[\w ]*([>|])(?:[\w ]*\1){2,}[\w ]*/

匹配 > 或 |,然后确保它再出现两次(至少)。

于 2013-04-09T09:47:19.103 回答
1
/(\s*\w+\s*([>\|])\s*)(\s*\w+\s*\2\s*){2,}\w*/

假设您需要一个字符(或 | 或 > 符号之间的更多字符),此方法有效 - 符号不能以任何方式在应用了正则表达式的行中混合。当然,不规则间距也得到了处理。额外捕获完整组。

干杯。

于 2013-04-09T09:54:41.947 回答
0

您可以尝试分组和反向引用

/(>|\|)[^>\|]*\1[^>\|]*\1/
于 2013-04-09T09:46:42.377 回答
0

经过几次测试,我决定使用这个正则表达式:

((\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*((>)(\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*){3,})|((\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*((|)(\\s)*(\\w)+((\\s)+(\\w)+)*(\\s)*){3,})

匹配所有这些测试用例:

    test.add(" a > bbb >   ccc >   dc");//true
    test.add("a > b > c > d");//true
    test.add("a >b> c> d");//true
    test.add("a>b>c>d");//true
    test.add("a>b>c");//false
    test.add("a>b>c| d >e >f");//false
    test.add(">a>b>c> d >e >f");//false
    test.add("<a>b>c> d >e >f");//false
    test.add("a>b>c< d >e >f");//false
    test.add("a>b>c> d >e >f>");//false
    test.add("a b>b>c d > d >e >f> a bcd");//true,
    test.add("ayse ciog > ayse ciog > ayse ciog > ayse ciog");//true

现在获得成功的结果,感谢您的帮助。

于 2013-04-09T11:48:13.243 回答