Regular-Expression
正則表達式匹配逗號分隔的值列表,不允許尾隨逗號
我想匹配:
- 啊啊啊
- 啊啊啊啊啊啊
- aaa,bbb,ccc
但不是帶有尾隨逗號的列表。我目前的正則表達式:
(\w{3},?)+
還匹配帶有尾隨逗號 (
aaa,bbb,
) 的列表。我在想我也可以這樣做:(\w{3})(,\w{3})*
但這很醜陋。我真正的正則表達式不匹配 3 個字母的單詞,而是更大的東西,重複正則表達式是醜陋的。如何解決這個問題?
您可以在 PCRE 中為您的大正則表達式命名,例如:
(?<big>[a-zA-Z0-9]+)
之後的所有內容都
?<name>
將使用給定的名稱進行記錄。稱為正則表達式子常式
因此,重複 (
?&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}$'
如果使用
perl
或 PCRE 正則表達式,您可以通過使用諸如(?1)
引用第一個擷取組中的正則表達式之類的方法來避免重複:grep -Px '(?:(\w{3}),)*(?1)'
這將匹配任何非空逗號分隔的 3 個字元單詞列表。改成:
grep -Px '(?:(?:(\w{3}),)*(?1))?'
允許一個空列表。