1

「string」で始まり、-[number] で終わらないすべての文字列 (url) と一致させようとしています。

だから私はこの正規表現を作りました

string/?.*(?!-[0-9]*)

私が理解したところでは、これは次のように読まれるはずです:

"string" で始まるすべての文字列に一致し、その後におそらく '/' があり、その後に '-' を含まない任意の文字列があり、その後に任意の数字が続きます。

ここに私のテスト文字列があります

string/kkk/aaa/sss/ddd-123
string/kkk/aaa/sss/ddd
string/kkk/aaa/sss
string/kkk/aaa
string/kkk
string/
string/kkk/
string/kkk/aaa/
string/74002

正規表現は、何があってもすべてに一致します。

誰かが私が間違っていた場所を教えてもらえますか?

4

3 に答える 3

2

あなたの式.*では、先読みの前にを追加しました。

これは、次のステップに進む前に、*一致するすべての使用可能な文字をスキップすることを意味します - これは本質的にすべてであるため、式はすべてに一致します。.これは通常、パターンの後にすべてを返したい場合に使用されます。

.*を先読みステートメントに移動するか、貪欲でないバージョンを使用する必要があります。

次のようなものを試してください

^string/?(?!.+?-\d+$).*

-上記は、数字で終わらないすべての文字列に一致します。また、パターンが一致するインスタンスの文字列全体も返します。ここでは、混乱を避けるために非貪欲を使用し、行の開始と終了のセレクター.+?を追加しました。パターンが成功した場合、 はすべての文字に一致します。^$.*

于 2013-07-25T09:56:12.020 に答える
0

あなたの問題は、正規表現が文字列全体に一致することを強制しないことです。

たとえば、次の行を見てください。

string/kkk/aaa/sss/ddd-123

この場合、 .を含めた.*後のすべてに単純に一致します。貪欲でない一致は、. を除くすべてに一致します。いずれの場合も、否定先読みで与えられたものを見つけることができません。string/-123d-123

正規表現を強制的に文字列 end ( $) (およびおそらく文字列 start ( ^) にも一致させる必要があります。

^string/?.*(?!-[0-9]*)$
于 2013-07-25T09:16:46.333 に答える