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

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

我想匹配:

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

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

(\w{3},?)+

还匹配带有尾随逗号 ( aaa,bbb,) 的列表。我以为我也可以:

(\w{3})(,\w{3})*

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

答案1

你可以给你的名字起个名字大的PCRE 中的正则表达式如下:

(?<big>[a-zA-Z0-9]+)

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

因此,repeats ( ?&name) 变得很容易:

^(?<big>[a-zA-Z0-9]+)(,(?&big))*$

在线测试

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

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

在线测试一下

将其与 grep 一起使用,如下所示:

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

答案2

如果使用perl或 PCRE 正则表达式,您可以通过使用诸如(?1)引用第一个捕获组中的正则表达式之类的方式来避免重复:

grep -Px '(?:(\w{3}),)*(?1)'

这将匹配任何非空逗号分隔的 3 个字符单词列表。改成:

grep -Px '(?:(?:(\w{3}),)*(?1))?'

允许空列表。

答案3

请用 -^((([a-zA-Z0-9]){1,45},){2}([a-zA-Z0-9]){1,45})$

这里,我将最大字数设置为45,因为英语最长的单词是45个字符,可以根据要求更改

答案4

正则表达式很简单:[^,]$回答问题。

感谢@Hkoof 的评论!

相关内容