我有关于Java正则表达式(模式,匹配器)和find()
的问题。我可以解析以下文字
Mo, We, Su 10:00 - 22:00
以便find()
的第一次调用返回以下组
group(1) = Mo
group(2) = 10:00
group(3) = 22:00
find()
的第二次调用应该返回
group(1) = We
group(2) = 10:00
group(3) = 22:00
find()
的第三次调用应该返回
group(1) = Su
group(2) = 10:00
group(3) = 22:00
提前致谢。
答案 0 :(得分:3)
<强>假设强>
Mo
,Tu
,We
,Th
,Fr
,Sa
和{{1 }}。<强>解决方案强>
你可以使用这个正则表达式(我允许间距灵活):
Su
上面的正则表达式非常严格 - 如果逗号分隔列表在当前星期几到时间范围之间包含其他内容(例如(Mo|Tu|We|Th|Fr|Sa|Su)(?=(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+(\d+:\d+) *+- *+(\d+:\d+))
),则不会产生匹配。
如果您完全确定字符串的格式是正确的,并且您只想提取数据,那么这个松散的正则表达式就足够了:
Su, Somethingelse 02:12 - 3:45
将它们放入字符串文字:
([a-zA-Z]+)(?=\D+(\d+:\d+)\D+(\d+:\d+))
<强>解释强>
"(Mo|Tu|We|Th|Fr|Sa|Su)(?=(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+(\\d+:\\d+) *+- *+(\\d+:\\d+))"
"([a-zA-Z]+)(?=\\D+(\\d+:\\d+)\\D+(\\d+:\\d+))"
(Mo|Tu|We|Th|Fr|Sa|Su)(?=(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+(\d+:\d+) *+- *+(\d+:\d+))
:匹配一周中的一天。
(Mo|Tu|We|Th|Fr|Sa|Su)
:零宽度(不会消耗文本)正向前瞻(如果内部模式匹配,则可以继续;否则,将失败匹配和回溯)。它由(?=(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+(\d+:\d+) *+- *+(\d+:\d+))
指定。
里面的模式是(?=pattern)
。在这里,我们尝试在一周的当天之后匹配文本部分,并捕获时间。
(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+(\d+:\d+) *+- *+(\d+:\d+)
:在星期几之后,我们可以用逗号分隔其他几天。
(?: *+, *+(?:Mo|Tu|We|Th|Fr|Sa|Su))* *+
:然后是时间范围。
您可以看到一些(\d+:\d+) *+- *+(\d+:\d+)
(空格,星号,加号)序列。 *+
表示匹配0个或更多 *
空格字符,贪婪,但允许回溯。 *
占有,这意味着它不允许回溯。您可以将其视为优化,以防止不必要的工作。
*+
对于这个,我假设一周中的日期是输入字符串中唯一的字母字符序列。我还假设时间戳是唯一可以存在数字的地方。