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