正規表現 - 任意の順序で単語

Twizzl:

のは、私は違った、多くの場合、複数回出現する必要がありますが、3つの文字列があるとしましょう。

  1. "ab" 正確に1回表示されます
  2. "cd" 正確に2回表示されます
  3. "ef" 正確に3回表示されます

のは、彼らが1つのカンマで区切られなければなら言ってみましょう。

それは次のように一致している必要があります:

  • ab,ef,cd,ef,cd,ef
  • cd,cd,ef,ab,ef,ef

それはすべきではないと一致します:

  • ab,cd,ef // 短すぎる

  • ab,xx,ef,cd,ef,cd,ef // xxは、無効です

  • xx,ab,cd,cd,ef,ef,ef // xxは、無効です

見つけた:

\b(?=\w*ab)(?=\w*cd)(?=\w*ef)[abcdcdefefef]{12}\b

しかし、私は、カンマと一致することはできませんし、私が最後に文字の数を持つすべての単語を追加したくない、私は大きな文字列の多くのためにこれを使用する必要があるため、([abcdcdefefef] {12})。

手助けのためにありがとうございます!

ジョープEggen:

正規表現忘れてください。

    Map<String, Long> expectedFreqTable = new HashMap<>();
    expectedFreqTable .put("ab", 1L);
    expectedFreqTable .put("cd", 2L);
    expectedFreqTable .put("ef", 3L);

    String[] words = input.split(",");
    Map<String, Long> actualFreqTable = Stream.of(words)
            .collect(Collectors.groupingBy(Function.identity(), 
                    Collectors.counting()));

    return expectedFreqTable.equals(actualFreqTable);

正規表現は、あまりにも複雑であり、権利を取得することは非常に難しいだろう。上記より冗長ですが、はるかに容易維持して読むことを。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=275732&siteId=1