gpt4 book ai didi

java - 复杂的正则表达式语句

转载 作者:行者123 更新时间:2023-12-01 23:29:54 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

(某物)\} 或单个任意字符 - 点

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

让我们看看最外面的()里面有什么。

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

(?: ) 表示里面的是非捕获组,也就是说,它不会像 ( ) 那样生成匹配组。它允许 | OR 表达式正确地彼此交替,而不包含最外面的 |.

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

第一个是 \\. ,它匹配 \ 后跟任何字符(注意 \\ 被转义 \ >,而 . 未转义。

第二个是字符类 [\\{}],它匹配除 \{ 以外的任何字符>}

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

所以如果你把它放在一起,就会匹配:

第一部分将匹配以 } 结尾的任何内容(第 1 组将不包含 },而整个匹配可以。在最后一个 } 之前,它将匹配:

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

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

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

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

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

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

关于java - 复杂的正则表达式语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com