regex 如何在正则表达式匹配中处理右括号?

7rfyedvj  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(234)

我正在尝试将一组文本作为匹配组匹配到一个带括号的项中。
文本本身可能有也可能没有括号。更复杂的是,文本可能有也可能没有引号,或者根本不存在,下面是预期输出的一些示例:

[quote=John]abc[/quote] // John
[quote="John"]abc[/quote] // "John"
[quote='John']abc[/quote] // 'John'
[quote='Joh]n']abc[/quote] // 'Joh]n'
[quote='Joh[]n']abc[/quote] // 'Joh[]n'
[quote]abc[/quote] // match

到目前为止,我所提出的模式是\[quote[=]?["]?([\s\S]*?)["]?\]|\[\/quote\],但在上面的4-5个示例中失败了,因为它看到了第一个右括号
这将用于dart

EDITabc中间的文本不应该是匹配的一部分,这意味着匹配#1应该是[quote...],匹配#2应该是[/quote],就像我当前的正则表达式模式一样

zrfyljdw

zrfyljdw1#

您可以使用此正则表达式:

\[quote(?:=(.+?))?][^\]\[]*\[/quote]

RegEx Demo

RegEx细分:

  • \[quote:匹配[quote
  • (?::启动非捕获组
  • =:匹配一个=
  • (.+?):匹配任意字符的1+,并在组#1中捕获
  • )?:结束非捕获组。?进行此可选匹配
  • ]:比赛结束]
  • [^\]\[]*:匹配0个或多个非[]的任意字符
  • \[/quote]:匹配[/quote]

如果您希望每行有2个匹配的开始和结束标记,则可以用途:

\[quote(?:=(.+?))?](?=[^\]\[]*\[)|\[/quote]

RegEx Demo 2

des4xlb0

des4xlb02#

试试这个。好像有用:

\[quote(?:=|=\s*(['"]))?([^\]]*)\1?\]([^\[]*)\[\/quote\]
mftmpeh8

mftmpeh83#

第一个月
regex101.com
其中:

  1. (?<=quote=)-quote=之后的所有内容,向后看
  2. (?=]abc)-]abc之前的所有内容,前瞻
  3. ["'a-zA-Z\[\]]+-在第1部分和第2部分之间允许哪些符号。
  4. (?<=quote])-quote]之后的所有内容,向后看
  5. (?=abc)-=abc之前的所有内容,前瞻

相关问题