0

正規表現のピリオドとセミコロンの間の任意の文字 (空白、キャリッジ リターン、その他のピリオド、および角かっこを含む特殊文字を含む) を一致させるにはどうすればよいですか?

たとえば、次のようになります。

SomeMethod().AnotherMethod("argument")
      .AnotherMethod(1, "arg");

一致できるようにしたい:

.AnotherMethod("argument")
      .AnotherMethod(1, "arg");
4

3 に答える 3

0

またはのいずれ[.](.*?);[.]([^;]*);

[.]charをエスケープするもう 1 つの方法であり.、伝統的に次を使用してエスケープされます。\.

于 2013-05-03T09:02:38.893 に答える
0

\.([^;]*);元の仕様どおりに動作しますが、すぐに問題が発生します...

実際には、これを適切に解析するには、名前付きグループと再帰的な正規表現が必要です。

これが出発点です(ルビーで):

re = %r{
  (?<sstr>      '(?:[^']|(?<=\\)')*?') {0}                    # single quoted
  (?<dstr>      "(?:[^"]|(?<=\\)")*?") {0}                    # double quoted
  (?<nstr>      [^;]*?) {0}                                   # non-string
  (?<arg>       (?:\g<sstr>|\g<dstr>|\g<nstr>|)) {0}          # optional arg
  (?<func>      \s*[a-zA-Z0-9_]+\s*\(\s*\g<arg>\s*\)\s*) {0}  # foo(arg)
  (?<chain>     \g<func>(?:\.\g<func>)*) {0}                  # chained foo(arg)
  ^\g<chain>;                                                 # match until ;
}x

pp re.match 'SomeMethod("With (a; Funky\', arg\"ument");'

上記は部分的な解決策にすぎないことに注意してください。たとえば、次のようなものは対象外です。

foo(cond()? 'even' : "more", "; funky")

しかし、コーディングしている言語に組み込みの関数/引数パーサーが見つからない場合は、正しい方向に進むことができれば幸いです。

于 2013-05-03T10:59:56.680 に答える