用“查找”查找部分文本

时间:2013-02-11 13:18:52

标签: java regex

我有关于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

提前致谢。

1 个答案:

答案 0 :(得分:3)

<强>假设

  • 一周的日期写为MoTuWeThFrSa和{{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个或更多 *空格字符,贪婪,但允许回溯。 * 占有,这意味着它不允许回溯。您可以将其视为优化,以防止不必要的工作。


 *+

对于这个,我假设一周中的日期是输入字符串中唯一的字母字符序列。我还假设时间戳是唯一可以存在数字的地方。

相关问题