簡體   English   中英

匹配以逗號分隔的列表中的組,忽略括號中的逗號

[英]Match groups in comma-delimited list, ignoring commas in brackets

我正在使用以下字符串:

required,something_here[arg1,arg2],hey_yo[abc=123], is_date,date_after[date1,date2]

我的目標是匹配由逗號分隔的組,但忽略括號內的逗號。 最終結果將是:

required
something_here[arg1,arg2]
hey_yo[abc=123]
is_date
date_after[date1,date2]

到目前為止,我已經能夠正確匹配逗號。 但是,這與我實際需要的相反。 我一直在使用的正則表達式是:

(,(?![^\[]*]))

關於如何重寫它以獲得當前結果的反面的任何建議?

http://regexr.com/39tb0

好吧,這里你去:

(?:[^\]\[,]+|\[[^\]\[]+\])+

這是一個正則表達式演示 您可以找到與模式匹配的內容:

Pattern pattern = Pattern.compile("(?:[^\\]\\[,]+|\\[[^\\]\\[]+]\])+");
Matcher matcher = pattern.matcher(str);
while (matcher.find())
    System.out.println(matcher.group());

這匹配所有不包含逗號或方括號的序列。 當我們遇到方括號時,該組將交替顯示在右方,與方括號之間的所有內容匹配,然后返回左側以將所有內容匹配到下一個逗號,然后沖洗並重復,從而有效地聲明匹配而不會出現不合格的逗號。

這是一個jdoodle代碼演示

您可以使用以下基於前瞻的正則表達式:

,(?![^\]\[]*\])

正則演示

(?![^\\]\\[]*\\])為負向超前,可通過確保逗號后沒有“ 0或多個非方括號字符,然后是] ”來確保逗號不在[]

要查找沒有前導和尾隨空格的項目,並允許空項目,可以使用以下方法:

(?=[^\s,])(?: ?[^[\s,]+|\[[^]]*])*|(?<=,|^)(?=\s*(?:,|$))

這個方法怎么樣

(?:([^,\[]*\[[^\]]*\])(?:,|$))|([^,\[\]]+(?:,|$))

http://regexr.com/39tbr

該圖案由兩個可選的圖案匹配組成,一個帶有括號,另一個不帶括號。 這也使用非捕獲組?:錨定匹配和分組。 但是,這兩個捕獲組應該與您要尋找的匹配。

從左到右閱讀:

  1. 匹配除逗號或大括號之外的所有內容,貪婪匹配
  2. 匹配選項支架
  3. 匹配除方括號外的所有內容
  4. 匹配逗號或行尾
  5. 要么
  6. 匹配除逗號或方括號之外的任何字符,至少一個字符,貪心匹配
  7. 匹配逗號或行尾

只是在這里扔,因為我想看看我能想到什么

([^,]+\[[^\],]*,[^\],]*\]|[^,]+)

暫無
暫無

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

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