正規表現の一致する文字列が私ので始まらない


93

PMDの場合、で始まる醜い変数について警告するルールが必要myです。
これは私がすべての変数受け入れるしなければならないことを意味しないと起動しますmy

したがって、次のように動作する正規表現(re)が必要です。

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

別のものを試しましたが、まだ機能していません。


1
私はそれが実際にはネガティブな後ろ向きであるべきだと思います(ネガティブな先見ではありません)。
Indrit 2011

回答:


43

他の人が提案しているように、先読みアサーションを使用することもできます。または、基本的な正規表現構文を使用するだけの場合:

^(.?$|[^m].+|m[^y].*)

これは、長さが0文字または1文字の文字列(^.?$)に一致するため、my。または、最初の文字がmそれ以上ない場合に、2つ以上の文字が続く文字列(^[^m].+); または、最初の文字がaのm場合は、その後にy^m[^y])を付けないでください。


これは私たちが今使えるものです。拡張正規表現に問題があるようですが、これは今のところ問題なく動作します。
Dominik Sandjaja 2010年

169
^(?!my)\w+$

動作するはずです。

最初にmy文字列の先頭で一致できないことを確認し、次に文字列の最後まで英数字を照合します。文字列のどこかに空白があると、正規表現が失敗します。入力に応じて、文字列を正規表現に渡す前に文字列の前後の空白を削除するか、オプションの空白マッチャーを正規表現に追加するを使用することができます^\s*(?!my)(\w+)\s*$。この場合、後方参照1には変数の名前が含まれます。

また、変数名が特定の文字グループで始まることを確認する必要がある場合は、たとえば[A-Za-z_]

^(?!my)[A-Za-z_]\w*$

から+への変更に注意してください*


63
/^(?!my).*/

(?!expression)ネガティブな先読みです。それexpression 、その位置から開始して一致しない位置に一致します。


7

受け入れる文字列を見つけるために負の文字列を一致させるよりも、正の一致を実行してそれらの文字列を拒否する方がはるかに読みやすいのではないでしょうか。

/^my/

4
それは簡単ですが、リポジトリにコミットするときにコードをチェックするルールに必要だったため、ロジックを「元に戻す」ことはできませんでした。
Dominik Sandjaja 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.