[英]What is the regex pattern for comma-separated list?
有時,我需要確保某些輸入是用逗號分隔(或任意分隔)的結構良好的數據列表。 例如,在現實世界中,我需要驗證這種格式: foo{bar:baz,abc:def},xyz,lol{rotfl:true}
,這是用逗號分隔的字符串列表,帶有或不帶有參數列表(也以逗號分隔)。 這個例子更加復雜,我只想提一下,以防止你們給出一些平凡的答案,例如:
為什么不能只使用explode()?
每當我想更好地了解正則表達式時,總能得到這一點。
為了簡單起見,我將使用另一個示例。 但是請記住:這不是實際問題! 這是更復雜的用例的簡化示例,在這里我確實必須使用正則表達式。
假設我需要一個正則表達式模式,以確保我的字符串是逗號分隔的郵政編碼列表。 每個郵政編碼的格式為xx-xxx
,其中x
是0到9之間的任何數字,並且至少有一個郵政編碼。 該列表需要正確用逗號分隔,這意味着:
通常,我會做這樣的事情:
$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}(?:,|$))+(?<!,)$
我認為解決此問題的最佳方法是為此使用implode()
或explode()
函數。 您是否有理由要使用正則表達式執行此操作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.