簡體   English   中英

逗號分隔列表的正則表達式模式是什么?

[英]What is the regex pattern for comma-separated list?

有時,我需要確保某些輸入是用逗號分隔(或任意分隔)的結構良好的數據列表。 例如,在現實世界中,我需要驗證這種格式: foo{bar:baz,abc:def},xyz,lol{rotfl:true} ,這是用逗號分隔的字符串列表,帶有或不帶有參數列表(也以逗號分隔)。 這個例子更加復雜,我只想提一下,以防止你們給出一些平凡的答案,例如:

為什么不能只使用explode()?

每當我想更好地了解正則表達式時,總能得到這一點。

為了簡單起見,我將使用另一個示例。 但是請記住:這不是實際問題! 這是更復雜的用例的簡化示例,在這里我確實必須使用正則表達式。

假設我需要一個正則表達式模式,以確保我的字符串是逗號分隔的郵政編碼列表。 每個郵政編碼的格式為xx-xxx ,其中x是0到9之間的任何數字,並且至少有一個郵政編碼。 該列表需要正確用逗號分隔,這意味着:

  1. 沒有逗號
  2. 沒有尾隨逗號
  3. 連續逗號不超過一個

通常,我會做這樣的事情:

$pattern = '#^\d{2}-\d{3}(?:,\d{2}-\d{3})*$#';

那可行。 有什么方法可以防止重復模式的\\d{2}-\\d{3}部分? 當然,我可以將其保存到這樣的變量中:

$zipCodePattern = '\d{2}-\d{3}';
$pattern        = "#^$zipCodePattern(?:,$zipCodePattern)*$#";

雖然,我很想知道是否可以在模式本身中完成此操作。

使用以下正則表達式模式:

^(\d{2}-\d{3}\b(,(?!$))?)+$

https://regex101.com/r/E1yHVY/7

它使用+匹配一次和無限次之間的郵政編碼。 在非捕獲組中, (?:,|$)僅允許在字符串末尾匹配不帶定界符的組,從而使其在列表中只有一個代碼的情況下起作用。 最后,使用負向后看來確保沒有尾隨定界符。

^(?:\d{2}-\d{3}(?:,|$))+(?<!,)$

我認為解決此問題的最佳方法是為此使用implode()explode()函數。 您是否有理由要使用正則表達式執行此操作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM