regexp: "string 'ではなく文字列「文字列」を検索することは可能ですか({'
質問
ディレクトリ内のすべてのファイルで、具体的な単語のすべての発生(偏向APIを使用したメソッド呼び出し)を見つけようとしています。更新された呼び出し(新しいAPI)を含まないすべてのそのような発生を見つけるためにRegexpが必要です。助けてくれませんか?
例:
- 非推奨API:方法(a、b、c)
- 新しいAPI:メソッド({a:a、b:b、c:c})
regexpは、「メソッド」を含むが「メソッド」({'」を含むすべてのファイルを見つける必要があります。
ありがとうございました。
解決
適切な方法は、ネガティブルックアヘッドオペレーターを使用することだと思います。 ?!
/method(?!\(\{)/
上記の状態、「任意の発生 method
あれは いいえ に続く ({
"
それはあなたの要件を提案されたよりもよく満たしています /method([^{]/
後者は文字列の終わりと一致しないため(つまり abc abc method
)そして、それは2つの文字の組み合わせを処理しません ({
あなたが非常にうまく要求したこと。
他のヒント
betelgeuse:tmp james$ echo " method(a,b,c) "> test1
betelgeuse:tmp james$ echo " method(a,b,c) " > test3
betelgeuse:tmp james$ echo " method({a:a, b:b, c:c})" > test2
betelgeuse:tmp james$ grep "method([^{]" test*
test1: method(a,b,c)
test3: method(a,b,c)
説明する: [ ]
キャラクタークラスを定義します - つまり、この位置のキャラクターはクラス内のすべてのものと一致します。
^
クラスの最初のキャラクターは否定です。それは、このクラスがあらゆるキャラクターと一致することを意味します を除外する このクラスで定義されたキャラクター。
{
もちろん、この場合に一致しないことを気にする唯一のキャラクターです。
したがって、一部の場合、これは文字を持っている任意の文字列と一致します method(
任意のキャラクターが続きます を除外する {
.
代わりにこれを行う他の方法があります:
betelgeuse:tmp james$ grep "method(\w" test*
test1: method(a,b,c)
test3: method(a,b,c)
\w
この場合、(Cロケールを仮定)に相当します [0-9A-Za-z]
. 。オプションのスペースを許可したい場合は、次のことを試すことができます。
betelgeuse:tmp james$ grep "method([[:alnum:][:space:]]" test*
test1: method(a,b,c)
test3: method( a, b, c)
betelgeuse:tmp james$
(grep構文で、 [:alnum:] is the same as
w;
:スペース:refers to any whitespace character - this is represented as
ほとんどの正規表現の実装で s`)
使用できます キャラクタークラス 除外する 続く {
, 、例:
/method\([^{]/