2

次のような文字列で Twitter スタイルのタグを検索する単純な正規表現があります。

$reg_exUrl = "/@([A-Za-z0-9_]{1,15})/";

これは、@ 記号の後の単語の一致に最適です。

やりたくないことの1つは、ピリオドに一致することです。

だから合ってるはず

「@フー」

しかし、一致するべきではありません

「@フー。」

次のように、ピリオドを禁止するように式を修正して追加しようとしました。

$reg_exUrl = "/@([A-Za-z0-9_]{1,15})[^\.]/";

これは、文字列の末尾にある場合に一致しないことを除いて、ほとんど機能します。例えば:

この「@foo more text here」に一致します

ただし、この「@foo」には一致しません

誰かが私が間違っているところを教えてもらえますか?

ありがとう

4

3 に答える 3

3

まず、元の式は次のように記述できます。

/@\w{1,15}/

\w[A-Za-z0-9_] と同等だからです。

第二に、式が名前と一致しない.ため、おそらくドットで終わる名前を一致させたくないという意味でした。これは次の方法で実行できます。

/@\w{1,15}(?![^\.]*\.)/

または、名前がドットで終わらないだけの長さに関係なく、名前を一致させたい場合は、

/@\w+(?![^\.]\.)/

ああ、一つ忘れていたのですが、あなたの問題は行頭^や行末などのアンカー文字がないことが原因でし$た。検証したい。

概要:ドキュメント内の任意の場所で名前を一致させたい場合は、アンカーを使用しないでください。特定の文字列が有効な名前であるかどうかを知りたい場合は、アンカーを使用してください。

于 2013-08-23T12:55:42.147 に答える
2

それが文字列の最後にある場合は、それが期待[^\.]されているため機能しません。

あなたが望むものは、次のように、後でドットがないことを確認するために否定的な先読みで行うことができます:

/@([A-Za-z0-9_]{1,15})(?![^\.]*\.)/

ここに画像の説明を入力

ここでテストしてください


このようにすることもできます:

/@([A-Za-z0-9_]{1,15})([^\.]*)$/

ここに画像の説明を入力

ここでテストしてください

これは、ドット以外のオプションの文字を許可し、文字列の最後にする必要があります。

于 2013-08-23T12:53:40.310 に答える