复杂的正则表达式语句

时间:2013-10-21 01:39:17

标签: java regex

我一直在努力研究正则表达式;但是,我似乎无法理解这两个正则表达式的说法。

private static final Pattern BALANCED_TEXT =
    Pattern.compile("(?s)((?:\\\\.|[^\\\\{}]"
                    + "|[{](?:\\\\.|[^\\\\{}])*[}])*)"
                    + "\\}"
                    + "|.");

private static final Pattern INPUT_PATTERN =
    Pattern.compile("(?s)(\\p{Blank}+)"
                    + "|(\\r?\\n((?:\\r?\\n)+)?)"
                    + "|\\\\([\\p{Blank}{}\\\\])"
                    + "|\\\\(\\p{Alpha}+)([{]?)"
                    + "|((?:[^\\p{Blank}\\r\\n\\\\{}]+))"
                    + "|(.)");

如果有人能够向我深入解释这两个正则表达式的陈述,我将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:2)

整个第一个正则表达式是:

(?s)((?:\\\\.|[^\\\\{}]|[{](?:\\\\.|[^\\\\{}])*[}])*)\\}|.

首先你应该取消java字符串转义(例如\\表示\)。你得到一个正则表达式:

(?s)((?:\\.|[^\\{}]|[{](?:\\.|[^\\{}])*[}])*)\}|.

首先是(?s)一个DOTALL标志,其中make .匹配换行符。 要看的第二件事是顶级结构。由于|是OR运算符,优先级最低,因此:

(something)\} OR SINGLE ANY CHARACTER - DOT

因此,它会首先尝试匹配以}结尾的内容(因为}是正则表达式中的特殊字符,它以\开头。}之前的部分将是因为围绕它()而与第1组匹配。

让我们看一下最外层()内的内容。

最外面的格式为(?: something)*。它将匹配0次或更多次something次重复。

(?: )表示内部的内容是非捕获组,也就是说,它不会像( )那样在匹配中生成一个组。它允许| OR表达式彼此正确交替,而不包括outtermost |.

让我们看看something是什么。它是一系列OR表达式,从左到右进行尝试。

第一个是\\.,其匹配\后跟任何字符(通知\\已转义\,而.未转义。

第二个是字符类[\\{}],它匹配任何不是\{}的字符。

第三个匹配字符{,后跟内部(?: )后跟}的0个或多个匹配项。内部(?: )匹配\后跟任何字符或任何不是\{}的字符。

所以,如果你将它们放在一起,那么匹配:

第一部分将匹配以}结尾的所有内容(第1部分不包括},而整个匹配可以。在上一个}之前它将匹配:

  • 空字符串
  • \
  • 转义的所有字符
  • { }
  • 之间的字符序列

更好地解释为:除了\之外它几乎可以匹配任何内容,{ }没有彼此匹配,它将不匹配嵌套{ {{1对。上述例外情况可由}转义。

它也会匹配任何角色(最后\),但该匹配将有空组1。

匹配的(java未转义)字符串示例:

.a}h{ello}}h{\{ello}}xh{\\ello}}

似乎正则表达式错误,因为它与{}}不匹配,但在命名为{}时匹配}{}}