私たちのパターンが大文字の正規表現であるとしましょう (ただし、大文字を検索するよりも複雑なパターンを持つことができます)
少なくともn 個の連続したパターン (この場合、探しているパターンは大文字のみ)を見つけるには、次のようにします。
(ルビー使用)
somestring = "ABC deFgHij kLmN pQrS XYZ abcdEf"
at_least_2_capitals = somestring.scan(/[A-Z][A-Z]+/)
=> ["ABC", "XYZ"]
at_least_3_capitals = somestring.scan(/[A-Z]{3}[A-Z]*/)
=> ["ABC", "XYZ"]
ただし、最大n 個の連続するパターン (たとえば、最大 1 個の連続する大文字)を検索するにはどうすればよいですか。
matches = somestring.scan(/ ??? /)
=> [" deFgHij kLmN pQrS ", " abcdEf"]
詳細な戦略
「少なくとも」正規表現をDFAに変換し、受け入れ状態を否定して否定する必要があることを読みました(その後、NFAに戻しますが、そのままにしておくことができます)ので、正規表現として記述します. 「1」を受け取ったパターンに遭遇し、「0」を受け取ったパターンを受け取っていないと考える場合、単純な DFA ダイアグラムを描くことができます (n=1 の場合、パターンは最大で 1 つ必要です)。
具体的には、これがどのように正規表現になるのか疑問に思っていました。一般的に、私の正規表現スキルは「少なくとも」だけでは発育不全になっていると感じているため、正規表現で「最大」を見つける方法を見つけたいと思っています。
つまずきの危険 - 精神的には適切な解決策とは言えません
この質問は、この投稿の複製ではないことに注意してください。受け入れられている方法論を使用すると、次のようになります。
somestring.scan(/[A-Z]{2}[A-Z]*(.*)[A-Z]{2}[A-Z]*/)
=> [[" deFgHij kLmN pQrS X"]]
これは、DFA が示すものではありません。2 番目に求められた一致を逃したという理由だけではありません。さらに重要なのは、「X」の後に別の大文字が続くため、「X」が含まれているべきではないということです。DFA からは、別の大文字が続く大文字は、受け入れ状態ではありません。
あなたは提案することができます
somestring.split(/[A-Z]{2}[A-Z]*/)
=> ["", " deFgHij kLmN pQrS ", " abcdEf"]
(ラバーダックさんに感謝)
しかし、正規表現のみを使用して最大 n 回の出現を見つける方法を知りたいと思っています。(知識のために!)