3

例でよりよく説明されます:

  1. HHH
  2. HHHH
  3. HHHBBHHH
  4. HHHBH
  5. BB
  6. HHBH

3つのHのみまたは3つのHの倍数に一致する正規表現を考え出す必要があります(したがって、6、9、12、... Hも問題ありません)。5つのHは問題ありません。そして、可能であれば、Perl正規表現を使用したくありません。

したがって、上記の入力の場合、正規表現は(1)、(3)、および(6)のみに一致します。ここでは正規表現から始めているので、これにどのようにアプローチするのか正確にはわかりません。

編集 何かを片付けるためだけに:、Hは3つのHの1つのグループにのみ含めることができます。3つのHのグループは、HHHまたはHHBHの場合があります。そのため、上記の例2では、​​最後のHが3つのHのグループに含まれていないため、一致しません。また、中央の2つのHはすでにグループ内にあるため、グループ内の最後の3つのHを取得することはできません。

4

3 に答える 3

3

次の正規表現を使用できます。

^([^H]*H[^H]*H[^H]*H[^H]*)+$

合計3Hまたは3の倍数を含む任意の文字列に一致します。間に他の文字が存在する可能性があります。

説明:

^              begin of string
(              start of group
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*        any string of characters (or none) which is not 'H'
)+             containing the group once or twice or ...
$              end of string

[^H]*Hサブパターンを3回繰り返すことにより、実際に3つHが含まれていることを確認し、[^H]*文字を区切ることができます。

注:いずれegrepかを使用するか、追加の引数を指定してgrepを実行してください-E

于 2012-07-28T15:57:19.290 に答える
2

これを使用して、3つのHの倍数に一致させます。

(H{3})+

これがあなたの例の完全な正規表現です:

^(H{3})+B*(H{3})*$

編集:連続していないHを数える必要があるようです。その場合:

^(([^H]*H){3})+[^H]*$

これは、3つのHの倍数を持つ任意の文字列と一致する必要があります。

于 2012-07-28T15:54:45.203 に答える
2

Hを非Hと任意にインターリーブできるが、Hの総数は3の非ゼロ倍数でなければならないという要件(したがって、Hを含まないXXXは一致しない)を考えると、正規表現の合計は次のようになります。些細なことではありません。これは初心者の正規表現ではありません。

正規表現の方言は、カウントとグループ化のメタ文字として扱い{}、1つ以上を含むと仮定します。要件が異なる正規表現システム(たとえば)を使用している場合は、それに応じて調整します。()+\{\}

文字列全体に一致する正規表現が必要なので、迷子のHは許可されません。したがって、で始まり、^で終わる必要があり$ます。前面と背面に任意の数の非Hを許可する必要があります。Hは、任意の数の非Hで区切ることができます。それは次のことにつながります:

^([^H]*H[^H]*H[^H]*H)+[^H]*$

痛い; 読みにくいです!+この行は、任意の数の非Hの後にH、任意の数の非H、別のH、任意の数の非H、および3番目のHが続く1つ以上の()グループで構成されている必要があります。これらすべての後に、任意の数の非Hを続けることができます。

{}カウントに使用する:

^(([^H]*H){3})+[^H]*$

それはまだ読みにくいです。私の説明では「前後の非Hの任意の数」と書かれていましたが、私[^H]*は後ろでのみ使用していることに注意してください。これは、繰り返しパターンにより、とにかく前面に任意の数の非Hが許可されるため、そのフラグメントを繰り返す必要がないためです。

于 2012-07-28T16:17:36.447 に答える