1

単語のリストを一致させたいのですが、それらの単語が本当に単語である場合は簡単です。たとえば/\b (pop|push) \b/gsx、文字列に対して実行された場合

ポップはドアを押しましたが、ポップバックしました

popとpushという単語に一致しますが、popされません。

通常は単語の境界と見なされる文字を含む単語にも同様の機能が必要です。だから私/\b (reverse!|push) \b/gsxは文字列に対して実行されたときに必要です

リバースプッシュ!リバース!プッシュ

逆にのみ一致する!押しますが、逆に一致しません!押します。明らかに、この正規表現はそれを行わないので、これらのファンキーな要件を処理するのに十分なほどスマートに正規表現を作成するには、\ bの代わりに何を使用する必要がありますか?

4

3 に答える 3

2

単語の末尾の \b は、「前の文字は単語の文字であり、次の文字 (次の文字がある場合) は単語の文字ではない」という意味です。 -「単語」の末尾にある単語文字これにより、否定的な先読みが残ります。

/\b (reverse!|push) (?!\w)/gx

AS3正規表現が先読みをサポートしていると確信しています。

于 2009-04-26T06:30:30.513 に答える
0

最初の問題は、交互に2つではなく、3つ(場合によっては4つ)のケースが必要になることです。

  • /\breverse!(?:\s|$)/逆行!単独で
  • /\bpush\b/自分で押す
  • /\breverse!push\b/一緒
  • /\bpushreverse!(?:\s|$)/これは考えられるケースです

2番目の問題は、がではないため、\bの後には一致しないことです。Perl 5が言っていることは次のとおりです。ドキュメントを調べて、同意するかどうかを確認することをお勧めします。"!"\w\b

単語の境界( "\ b")は、一方の側に「\ w」があり、もう一方の側に「\ W」がある2つの文字の間のスポットであり、架空の文字を数えます。 「\W」に一致する文字列の最初と最後。(文字クラス内では、「\ b」は、二重引用符で囲まれた文字列で通常行われるように、単語の境界ではなくバックスペースを表します。)

したがって、必要な正規表現は次のようなものです。

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

この正規表現に/sはピリオドがないため、省略しました。したがって、1行として扱うのは意味がありません。/sエンジン内で単一の行として扱うことを意味しない場合は、おそらくそれを追加し直す必要があります。また、エンジンが交代をどのように処理するかについても読む必要があります。Perl 5では、正しい動作を実現するには、アイテムをこのように配置する必要があることを知っています(そうしないと、reverse!は常にreverse!pushに勝ちます)。

于 2009-04-26T04:07:00.420 に答える
0

\b を同等のものに置き換えることができますが、厳密ではありません:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

このようにして、\b(実際の\w単語文字の前または後にのみ一致できるという) の制限要因が取り除かれます。

空白または文字列の開始/終了が有効なセパレーターとして機能するようになり、実行時に検索語のリストなどから内部式を簡単に作成できるようになりました。

于 2009-04-26T07:56:34.160 に答える