【问题标题】:A regex to parse regex string用于解析正则表达式字符串的正则表达式
【发布时间】:2022-01-25 12:24:18
【问题描述】:

我需要用正则表达式解析一个正则表达式。我有一个正则表达式字符串:

[a-z]{1}[-][0-9]{4}[-][ab]

我想出的用于解析上述字符串的实际正则表达式,并且 几乎可以工作 是:

/(?|\[(.*?)\]\{(.*?)\}|\[(.*?)\](.*?))/g

它的作用可以在这个 regex101 example 中看到,这里的错误是在 Match 2 及其 Group 1 (-][0-9,应该只是-)。


目标是匹配方括号 [] 内的所有内容,后跟大括号 {} 内的数字。如果方括号 [] 后面的大括号 {} 丢失,则应使用 null 填充它,这就是替代组对分支重置组所做的事情。此外,如果只是方括号后跟一个方括号,那么它也应该在以后起作用(匹配方括号内部的内容 [] 并用 null 填充 Group 2 em>)。

我的正则表达式不会在第三个[-] 上停止并将其匹配到-][0-9 而不是仅匹配- 然后从解析[0-9]{4} 开始。

预期的匹配应该是:

[a-z]{1}
a-z
1

[-]
-
null

[0-9]{4}
0-9
4

[-]
-
null

[ab]
ab
null

当前匹配不正确,如下:

[a-z]{1}
a-z
1

[-][0-9]{4}
-][0-9
4

[-]
-
null

[ab]
ab
null

我错过了什么?

【问题讨论】:

  • 这是您所期望的吗? \[([^]]*)](?:\{(\d+)\})?。如果{} 中的量词缺失,则该匹配项将没有第 2 组
  • 是的,这非常接近,虽然 Group 2 必须始终存在,如果缺少,则应将其设置为 null。请给出答案。
  • 我明白了,我错过了这部分 [([^]]*)\]。谢谢!
  • 使用this,您将始终获得第 1 组和第 2 组。但是,在第 2 组中,大括号也将被捕获:(
  • 是的,这也可以。谢谢您的帮助!请给出答案。

标签: regex perl


【解决方案1】:

这个正则表达式应该可以工作:

\[([^]]*)](\{\d+\}|)

Demo

说明:

  • \[ - 匹配 [
  • ([^]]*) - 匹配 0+ 次出现的非 ] 的任何字符,并在组 1 中捕获此子匹配
  • ] - 匹配 ]
  • (\{\d+\}|) - 不匹配任何内容或 { 后跟 1+ 位数字后跟 }。匹配的内容存储在第 2 组中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多