考慮以下的正則表達式:爪哇重複圖案匹配(2)
(([^\|])*\|)*([^\|]*)
這個模式匹配重複的字符串模式的類型
("whatever except |" |) {0 to any times} ("whatever except |" |) {1 time}
所以應該符合以下的字符串,其具有17的子串(重複16次,加上「z」作爲最後一個)。
"abcd | e | fg | hijk | lmnop | | | qrs | t| uv| w |||||x y| z"
事實上,RegexPal驗證給定的正則表達式匹配不上面的字符串。
現在,我想要獲得每個子字符串(即「abcd |」,「e |」,「fg |」等),對於它們的數量,長度等沒有預先知識。
根據類似同名previous StackOverflow post和Matcher
類find()
方法的文檔,我只需要像做
Pattern pattern = Pattern.compile(regex); // regex is the above regex
Matcher matcher = pattern.matcher(input); // input is the above string
while (matcher.find())
{
System.out.println(matcher.group(1));
}
然而,當我這樣做我只是得到2串打印出來:在最後重複的子字符串(「xy |」)和空值;絕對不是我期望的16個子串。
一件很好的事也將是檢查比賽中實際發生,運行find()
循環之前,但我不知道是否matches()
,groupCount() > 0
,或其他一些條件,應使用,而不做兩次匹配工作,因爲find()
也做匹配。
所以,問題:
- 我怎樣才能得到所有16個重複子?
- 我怎樣才能得到最後一個子字符串?
- 如何檢查字符串是否匹配?
非常感謝您的出色解決方案!我可以要求稍微擴展嗎?分隔符有時以下劃線(_)作爲前綴,給出_ |在子串之間,除了當子串是空的時候,在這種情況下它不會出現。所以情況可能像「abcd _ | e || fg _ |||| hij」。換句話說,我們在|之前有一個「可選」下劃線並且我想在出現時關閉它(它不出現在子字符串中)。我試着修改你的正則表達式,但是我想出了什麼都沒有奏效。 – PNS
@PNS:所以使用'\ G([^ \ |] +?)_?\ || \ G()\ || \ G([^ \ |] *)$'並且獲得非空的組作爲你的文字。第一部分包含非空數據後跟一個分隔符,第二部分包含空數據後跟一個分隔符,第三部分包含最後一部分數據。 – maaartinus
@PNS,上面的更新模式 – TJR