9

先読みアサーション(?=)に問題があります。たとえば、次の式があります。

/Win(?=2000)/

Win式が、のようであれば、Win2000一致しWin2000fgFます。次の表現があります:

^(?=.*\d)(?=.*[a-z]).*$

数字と小文字に一致します。例:45dF4Dd。しかし、なぜそれが機能し、すべての文字と一致するのかわかりません:)以前の文字はありません(?=.*\d)。私は、この式だけが機能するはずだと思います:

^.\*(?=.*\d)(?=.*[a-z]).*$

\*式の前に)。

説明してもらえますか?

4

2 に答える 2

39

私たちが正規表現エンジンであり^(?=.*\d)(?=.*[a-z]).*$、文字列に正規表現を適用するとします2a

位置0(最初の文字の前)から開始:

  1. ^:文字列の先頭にいることを確認してください:OK
  2. (?=:次の正規表現が一致するかどうかを確認しましょう...
  3. .*:任意の数の文字に一致-> 2a。わかった。
  4. \d:いいえ、もう終わりです。1文字戻りましょう:a->いいえ、一致しません。別のものに戻ります:2-> MATCH!
  5. ):先読みの終わり、一致は成功しました。私たちはまだポジション0にいます!
  6. (?=:次の正規表現が一致するかどうかを確認しましょう...
  7. .*:任意の数の文字に一致-> 2a。わかった。
  8. [a-z]:いいえ、もう終わりです。1つのキャラクターに戻りましょう:a-> MATCH!
  9. ):先読みの終わり、一致は成功しました。私たちはまだポジション0にいます!
  10. .*:任意の数の文字に一致-> 2a-> MATCH!
  11. $:見てみましょう-私たちは文字列の最後にいますか?はい、そうです!->マッチ!
  12. ねえ、正規表現の終わりに達しました。素晴らしい。試合が完了しました!
于 2010-09-26T15:27:13.030 に答える
4

先読みは一致しない、と彼らは主張している。

これは、先読みを使用する場合、さらに先に進みたい場合は、必要なものと一致するものが必要であることを意味します。

于 2010-09-26T14:48:06.150 に答える