我一直在努力研究正则表达式;但是,我似乎无法理解这两个正则表达式的说法。
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\\\\{}]+))"
+ "|(.)");
如果有人能够向我深入解释这两个正则表达式的陈述,我将不胜感激。提前谢谢!
答案 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}}
,x
,h{\\ello}}
似乎正则表达式错误,因为它与{}}
不匹配,但在命名为{}
时匹配}
和{}}
。