如何匹配Regex中句号和分号之间的任何字符,包括空格、回车符以及其他句号和特殊字符(包括括号)?
例如:
SomeMethod().AnotherMethod("argument")
.AnotherMethod(1, "arg");
我希望能够匹配:
.AnotherMethod("argument")
.AnotherMethod(1, "arg");
.([^;]*);
似乎符合要求。
请注意,你问的问题可能比你真正需要的更简单:大概你想从SomeMethod().AnotherMethod("foo; bar; and baz").AnotherMethod(1);
得到类似的结果,但是你要求的正则表达式将在第一个;
停止。
[.](.*?);
或[.]([^;]*);
。
[.]
只是转义.
字符的另一种方式,传统上使用.
.([^;]*);
按您的原始规格工作,但您很快就会遇到问题…
在实践中,你需要命名组和递归正则表达式来正确解析。
这是一个起点(在ruby中):
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")
但是如果你找不到你正在编码的语言的内置函数/参数解析器,它会让你在正确的方向上开始。