0

私は単純な正規表現を実装していますが、スターの動作を理解するのに苦労しています。

a*b が検索式だとします。ターゲット テキスト aaaaaabbc および 1345536 に適用するとどうなるでしょうか。

star は前の文字を 0 個以上取るため、両方とも合格する必要があります。そうじゃない?ここのhttp://www.zytrax.com/tech/web/regex.htmは、そうではないと言っています。

そうでない場合、反復を停止するにはどうすればよいですか? やめさせるのは、確立されたルールを破っているように感じます。

- - - - 編集

2番目のものでうまくいくはずだと私が言った理由はこれです。ゼロ以上の a があるはずであり、ゼロの a があります。それが進むにつれて、文字がなくなり、b と比較する機会がなくなります。じゃあお見合いじゃないの?

それは私が得ることができないものです。どのように、いつチャンスを得ることができますか?

4

4 に答える 4

2

a*b が検索式だとします。ターゲット テキスト aaaaaabbc と 1345536 に適用するとどうなるでしょうか。

aaaaaabbc場合、最初の文字 (an a) で一致を試み始め、一致できることがわかり、最初の に到達するまで続けbます。その時点で停止し、成功を宣言します。(一部の言語では、デフォルトで暗黙的な文字列全体のアンカーが正規表現に追加されますが、従来はどこでも一致できます。)

を使用1345536すると、最初の文字で一致を試み、一致しない (どちらaでもないb) ことが判明したため、2 番目の文字からの試行に進みます。一致を開始できるポイントが見つからないため、文字列全体が一致しません。

また、考えてみましょうaaac(使用していないケースですが、参考になります)。ステート マシンは を見つけて一致を試みa始めますが、必須が見つからないため、実際には一致を完了することはなく、文字列は一致しません。 b

2番目のものでうまくいくはずだと私が言った理由はこれです。ゼロ以上の a があるはずであり、ゼロの a があります。それが進むにつれて、文字がなくなり、b と比較する機会がなくなります。じゃあお見合いじゃないの?

それは私が得ることができないものです、どのように、いつチャンスを得るでしょうか?

が何かに一致するためa*bには、0 個以上aの s の後に必須の が続く必要がありますb。はい、as はオプションですが、そうでbはありません。一致が見つかるには、存在する必要があります。ありませんb1345536決して一致することはありません。aRE エンジンは、最初にまたはを探しますb。どちらでも構いません。が見つかった場合は、 aに到達する (一致) か、非(および非) に到達する (不一致)まで、 s のaスキャンの一致を試行し始めます。見つかった最初の文字が;だった場合 一致はすぐに見つかります。abbab

要するに、a*b意味を多少誤解しています。のオプション性は、 とaは何の関係もありませんb

于 2012-08-08T21:02:15.363 に答える
1

あなたが示した例では、「1345536」文字列は「a*b」と一致しません。これは「b」が必要だからです。これらは一致します:

aaaaaaaaab
aaaaaabc
121435b

* 記号は、その前に 0 個以上の文字があることを意味します。したがって、「b」を任意の場所に置くと一致します。「a」は、一致するグループを取得するためだけのものです。

test  | Group
1aab => aab
ab   => ab
bab  => b, ab

編集:

あなたが考えている方法は、正規表現がどのように機能するかではありません。regular-expressions.infoによると、最後までテストする必要があります。キャラクター。"。

1345536 で a*b をテストすると、次のようになります (実際にはこれではありませんが、アイデアは得られます)。

  • 最初の文字を確認する
  • 「あ」ですか?
  • いいえ
  • それは「b」ですか?
  • いいえ
  • そして次のキャラへ

'b' は、テスト文字列の文字のそれぞれにチャンスを得ました。

于 2012-08-08T19:01:39.470 に答える
0

どの言語かは言いませんでしたが、ほとんどの正規表現の実装では、アスタリスクは「前の文字のa*b0個以上」を表すため、「「a」の後に「b」が続く0個以上」を表します。

したがって、最初のターゲットa*bのサブストリングと一致する必要aaaaaabがありますが、2番目のターゲットではまったく一致しません。

于 2012-08-08T18:56:28.040 に答える
0

正規表現はステート マシンと同形です。基本的なアイデアが完成したら、コードは明らかなはずです。計算理論の基本的なコースはすべてこれをカバーしています。または、 Ken Thompson の元の論文を読んでください。

于 2012-08-08T19:40:44.933 に答える