如何在正则表达式中匹配句号和分号之间的任何字符



如何匹配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")

但是如果你找不到你正在编码的语言的内置函数/参数解析器,它会让你在正确的方向上开始。

相关内容

  • 没有找到相关文章

最新更新