Kar*_*rlo 1 regular-expression
我想匹配:
但不是带有尾随逗号的列表。我目前的正则表达式:
(\w{3},?)+
Run Code Online (Sandbox Code Playgroud)
还匹配带有尾随逗号 ( aaa,bbb,
) 的列表。我在想我也可以这样做:
(\w{3})(,\w{3})*
Run Code Online (Sandbox Code Playgroud)
但那是相当丑陋的。我真正的正则表达式不匹配 3 个字母的单词,而是匹配更大的东西,并且重复正则表达式很丑陋。如何解决这个问题?
您可以在 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)