18

正規表現が怖いのはうんざりです。この投稿のトピックは正規表現のPHP実装に限定されていますが、一般的な正規表現のアドバイスはもちろんありがたいです(つまり、PHPに適用できないスコープと混同しないでください)。

次の(私は信じています)は、数字の間の空白を削除します。そうするためのより良い方法があるかもしれませんが、それでも私は何が起こっているのかを理解したいと思います。

$pat="/\b(\d+)\s+(?=\d+\b)/";
$sub="123 345";
$string=preg_replace($pat, "$1", $sub);

パターンを見ていくと、私の解釈は次のとおりです。

  • \b単語の境界
  • \d+1桁以上のサブパターン
  • \s+1つ以上の空白
  • (?=\d+\b)1つ以上の数字の後に単語境界が続く先読みアサーション?
  • すべてをまとめて、単語の境界、1つ以上の数字、空白の順に検索し、ある種の先読みアサーションを実行して、パターンを置き換えることができるように結果を$ 1に保存しますか?

質問:

  • 私の上記の解釈は正しいですか?
  • その先読みアサーションとは何ですか?
  • 先頭/と末尾の目的は何/ですか?
4

2 に答える 2

18

私の上記の解釈は正しいですか?

はい、あなたの解釈は正しいです。

その先読みアサーションとは何ですか?

この先読みアサーションは、実際にパターンを一致させる必要なしに、前に特定のパターンがある文字を一致させる方法です。

したがって、基本的に、正規表現を使用しabcd(?=e)て文字列を一致abcdeさせると、一致が得られますabcd

これが一致する理由は、文字列abcdeに実際には次のものが含まれているためです。

  1. アンa
  2. 続いてb
  3. 続いてc
  4. 続いてd that has an e after it(これは単一の文字です!)

4番目の項目の後には、実際の「e」文字も含まれていることに注意してください。これは一致しませんでした。

一方、文字列を正規表現と照合しようとするとabcd(?=f)、次のシーケンスが発生するため失敗します。

"a", followed by "b", followed by "c", followed by "d that has an f in front of it"

見つかりません。

先頭/および末尾/の目的は何ですか

これらは区切り文字であり、PHPでは、文字列のパターン部分と文字列の修飾子部分を区別するために使用されます。区切り文字は任意の文字にすることができますが、私@は自分で署名することを好みます。パターンで使用する場合は、区切り文字として使用している文字をエスケープする必要があることに注意してください。

于 2012-11-30T13:35:43.457 に答える
6

このビデオとそれに続く4つのビデオを見るのは良い考え です:http: //blog.themeforest.net/screencasts/regular-expressions-for-dummies/ シリーズの残りはここにあります: http:/ /blog.themeforest.net/?s=regex+for+dummies

同僚からシリーズが送られてきました。それらをすべて見た後、正規表現を使用する方がはるかに快適でした。

もう1つの良いアイデアは、RegexBuddyまたはRegexrをインストールすることです。特にRegexBuddyは、正規表現の仕組みを理解するのに非常に役立ちます。

于 2012-11-30T13:39:51.587 に答える