0

我一直在努力学习正则表达式;但是,我似乎无法理解这两个正则表达式在说什么。

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\\\\{}]+))"
                    + "|(.)");

如果有人能深入地向我解释这两个正则表达式语句,我将不胜感激。提前致谢!

4

1 回答 1

3

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

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

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

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

首先是(?s)带有.匹配换行符的 DOTALL 标志。其次要看的是顶层结构。由于|是 OR 运算符,优先级最低,因此它是:

(something)\} OR SINGLE ANY CHARACTER - DOT

所以它首先会尝试匹配以}( 结尾的东西,因为}它是正则表达式中的一个特殊字符,它以 . 开头\。之前的部分}将被匹配为组 1,因为()它周围。

让我们看看最外层里面是什么()

最外层的形式是(?: something)*。它将匹配 0 个或多个重复的something.

(?: )意味着里面是一个非捕获组,也就是说,它不会像( )这样在匹配中生成一个组。它允许|OR 表达式在不包括最外层的情况下正确地相互交替|.

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

第一个是\\.匹配\后跟任何字符的匹配项(注意\\已转义\.而未转义。

第二个是[\\{}]匹配任何不是\or{或的字符的字符类}

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

因此,如果您将这些放在一起,则匹配:

第一部分将匹配任何以}(group 1 将不包括},而整个匹配可以。在最后}它将匹配:

  • 空字符串
  • 任何被转义的字符\
  • 之间的字符序列{ }

更好地解释为:它将匹配除\自身之外的几乎任何东西,{ }没有彼此,它不会匹配嵌套{ }对。上述异常可以通过\.

它也将完全匹配任何字符(最后一个.),但该匹配将有空组 1。

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

a}, h{ello}}, h{\{ello}}, x, h{\\ello}},{}}

似乎那个正则表达式是错误的,因为它不会匹配{},但它会匹配}并且{}}同时被命名BALANCED_TEXT

于 2013-10-21T14:18:17.920 回答