2009-08-18 9 views
0

Contract.Requireステートメント内にない限り、C#ファイルのすべての文字列を見つける必要があります。文字列にはテキストの量があるので、文字列とContract.Requireの間にある "and"と任意の量のテキストがあります。正規表現の前に単語がありません

私はこれを持っている:

文字列を見つけ、私は私の検索を絞り込むために必要
/".+"/ 

これも可能ですか?

+0

同じライン上の2つの文字列が存在する場合どうなりますか?エスケープされた「文字列の中に」ある場合はどうなりますか? –

+0

通常の文法ではなく、確実に動作しない – annakata

+0

コメントアウトされた文字列がある場合はどうなりますか? –

答えて

1

本当に正規表現を使用する場合は、負のlookbehindを使用して、文字列の前にContract.Requireが付いていないことを確認できます。しかし、この解決策には多くの注意点があります(commenなど)ので、おそらくあなたの最善の選択肢ではありません。

import re 
reg = re.compile('(?<!Contract\.Require\()"([^"\\\]|\\\.)*"') 
tests = [ 'Contract.Require("test string")', 
      'OtherRequire("test string" + someVar)', 
      'String var = "testString";', 
      'String another = "test\\"quotestring"', 
      'String empty = ""' ] 

for test in tests: 
    m = reg.search(test) 
    print test, "wasn't matched." if m == None else "matched " + m.group(0) + "." 

出力

Contract.Require("test string") wasn't matched. 
OtherRequire("test string" + someVar) matched "test string". 
String var = "testString" matched "testString". 
String another = "test\"quotestring" matched "test\"quotestring". 
String empty = "" matched "". 

上記の式の後読みがあるとにかく、ここではPythonで同様のものを使用しての簡単なデモは(あなたがに必要にそれを適応させる)です(?<!Contract\.Require\()であり、文字列リテラルと一致する正規表現は"([^"\\\]|\\\.)*"です。このやや複雑文字列リテラルのための正規表現は、このような「引用\」引用」などの文字列を一致させることができるようにするために必要とされる。

はそれがお役に立てば幸いです。

関連する問題