正则表达式匹配逗号分隔的值列表,不允许尾随逗号

Kar*_*rlo 1 regular-expression

我想匹配:

  1. 啊啊啊啊
  2. 啊啊啊啊啊啊
  3. aaa,bbb,ccc

不是带有尾随逗号的列表。我目前的正则表达式:

(\w{3},?)+
Run Code Online (Sandbox Code Playgroud)

还匹配带有尾随逗号 ( aaa,bbb,) 的列表。我在想我也可以这样做

(\w{3})(,\w{3})*
Run Code Online (Sandbox Code Playgroud)

但那是相当丑陋的。我真正的正则表达式不匹配 3 个字母的单词,而是匹配更大的东西,并且重复正则表达式很丑陋。如何解决这个问题?

ImH*_*ere 6

您可以在 PCRE 中为大型正则表达式命名,例如:

(?<big>[a-zA-Z0-9]+)
Run Code Online (Sandbox Code Playgroud)

之后的所有内容都?<name>将使用给定的名称进行记录。
调用正则表达式子程序

因此,重复 ( ?&name) 变得容易:

^(?<big>[a-zA-Z0-9]+)(,(?&big))*$
Run Code Online (Sandbox Code Playgroud)

在线测试

因此,例如,匹配 IP 变得更简单:

^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$
Run Code Online (Sandbox Code Playgroud)

在线测试

将其与 grep 一起使用:

grep -P '^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$'
Run Code Online (Sandbox Code Playgroud)