我有以下模式定義:Java:如何使用Pattern類來提取表達式的片斷?
此正則表達式應該與表達這樣的:
- 「週一至週五」
- 「週二至週五,太陽」
- 「星期一-Wed,Fri-Sun「
我在.NET中使用命名組非常容易,但是在Java中6我有點失落。任何人都可以向我展示一個代碼示例,它可以讓我提取日期,並準確理解給定表達式中提及的範圍和單日。
謝謝。
EDIT1
OK,這裏是我得到的檢查的m_daysRegex.matcher("Mon-Fri")
組:
matchDays.groupCount() = 10
matchDays.groups = [0,7,0,7,-1,-1,0,7,0,3,4,7,-1,...,-1] (22 values)
matchDays.group(0) = "Mon-Fri"
matchDays.group(1) = "Mon-Fri"
matchDays.group(2) = null
matchDays.group(3) = "Mon-Fri"
matchDays.group(4) = "Mon"
matchDays.group(5) = "Fri"
matchDays.group(6) = null
matchDays.group(7) = null
matchDays.group(8) = null
matchDays.group(9) = null
matchDays.group(10) = null
有人能向我解釋這一切的邏輯是什麼?我的意思是,我不僅應該得到「星期一」和「星期五」,而且還必須知道它們是範圍子表達式「星期一至星期五」的一部分,而不僅僅是「星期一,星期五」。
BTW,匹配 「週一,週五」 給了我們這樣的:
matchDays.groupCount() = 10
matchDays.groups = [0,7,0,3,0,3,-1,-1,-1,-1,-1,-1,4,7,4,7,-1,...,-1] (22 values)
matchDays.group(0) = "Mon,Fri"
matchDays.group(1) = "Mon"
matchDays.group(2) = "Mon"
matchDays.group(3) = null
matchDays.group(4) = null
matchDays.group(5) = null
matchDays.group(6) = "Fri"
matchDays.group(7) = "Fri"
matchDays.group(8) = null
matchDays.group(9) = null
matchDays.group(10) = null
這是不同的,這是很好的。我仍然很難理解該算法。
在.NET中這很容易,所以我期待Java中的一些操作很簡單。公平,不是嗎?
EDIT2
是否有一個Java正則表達式指南解釋這個東西?到目前爲止,我看到的所有指南都檢查了非常簡單的正則表達式
EDIT3
OK,我開始明白這一點。我的正則表達式可以這樣描述:
( // 1 = D1|D2-D3
(D1)| // 2 = D1
( // 3 = D2-D3
(D2)- // 4 = D2
(D3) // 5 = D3
)
)
(?:,
( // 6 = D4|D5-D6
(D4)| // 7 = D4
( // 8 = D5-D6
(D5)- // 9 = D5
(D6) // 10 = D6
)
)
)*
它解釋了「週一至週五」和「週一,週五」的組值。但是如何處理重複?例如,「星期一,星期三,星期五」?仍在試圖弄清楚。
EDIT4
我現在明白了。我可以匹配複雜的正則表達式,但我無法輕鬆提取各個匹配項 - 必須使用find()
方法和更簡單的子正則表達式迭代。所以,在我的情況下,我決定:
- 匹配整個表達式,以確保它是有效的
- 分割它(與
StringUtils.split
從阿帕奇)用「」 - 迭代分裂部,分裂如有必要,按' - '。
感謝所有的善良撒瑪利亞人在那裏的所有幫助。
我根本不會使用RegExp來解析這樣簡單的字符串。你想達到什麼目的?你只需要知道,如果字符串匹配「模式」,或者你需要「理解」字符串? – RoToRa 2012-08-10 11:24:46