[英](Ruby) parsing a string with RegEx
這是我要解析的字符串: 2 Sep 27 Sep 28 SOME TEXT HERE 35.00
我想將其解析為一個列表,以便值看起來像:
list[0] = 'Sep 28'
list[1] = 'SOME TEXT HERE'
list[2] = '35.00'
我一直在研究的RegEx:
^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}([a-zA-Z0-9]*\s{1})+(\d+.\d+)
我的價值觀是:
list[0] = 'Sep 28'
list[1] = 'HERE'
list[2] = '35.00'
list[1]
值關閉。 我也可能沒有正確解析空格,但是在“ Pickaxe”書或在線指南中找不到任何指導。
您的問題出在第二個捕獲組中:
([a-zA-Z0-9]*\s{1})+
重復帶括號的組,分別匹配單詞'SOME'
, 'TEXT'
和'HERE'
,使第二個捕獲組僅帶有最后一個匹配項'HERE'
。
您需要將+
放在捕獲括號中的組中,並使用非捕獲括號(?:...)
將現有組括起來。 非捕獲括號(使用(?:
來開始組,並使用)
結束組)是正則表達式中將比賽的各個部分組合在一起而不捕獲組的一種方式。 您可以在非捕獲組上使用重復運算符( +
, *
, {n}
或{n,m}
),然后捕獲整個表達式:
((?:[a-zA-Z0-9]*\s{1})+)
總共:
/^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}((?:[a-zA-Z0-9]*\s{1})+)(\d+.\d+)/
另外,這是一個笨拙的正則表達式。 您根本不需要在正則表達式中指定{1}
,因為默認情況下是單個匹配項。 同樣, \\d\\d
比\\d{2}
少鍵入一個字符。 另外,您可能只需要\\w
而不是[a-zA-Z0-9]
。 由於您似乎並不關心大小寫,因此您可能只想使用/i
選項並簡化字母字符類。 這樣的事情是一個更慣用的正則表達式:
/^\d [a-z]{3} \d\d ([a-z]{3} \d\d) ((?:\w* )+)(\d+.\d+)/i
最后,盡管用於正則表達式的Ruby文檔有些薄,但是Ruby使用了一些與Perl兼容的標准正則表達式,您通常可以在regular-expressions.info上找到有關正則表達式的更多信息。
您可能也曾在這里嘗試過此工具,但我強烈建議Rubular 。 它提供了非常快速的字符串解析。
看來您已經獲得了問題的特定答案,所以我只想為其他來訪者提供幫助,以便他們知道在哪里測試他們的正則表達式或進行練習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.