Regular-Expression

正則表達式匹配逗號分隔的值列表,不允許尾隨逗號

  • May 11, 2021

我想匹配:

  1. 啊啊啊
  2. 啊啊啊啊啊啊
  3. 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))?'

允許一個空列表。

引用自:https://unix.stackexchange.com/questions/524606