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 ]*/

> または | に一致し、それが (少なくとも) 2 回以上表示されるようにします。

于 2013-04-09T09:47:19.103 に答える
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 に答える