【发布时间】:2019-02-27 17:08:46
【问题描述】:
是否有人可以帮助我解决以下问题:
我正在尝试在文本中查找特定的日期和时间字符串(在 VBA Word 中使用)。 目前正在使用以下 RegEx 字符串:
(?:([0-9]{1,2})[ |-])?(?:(jan(?:uari)?|feb(?:ruari)?|m(?:aa) ?rt|apr(?:il)?|mei|jun(?:i)?|jul(?:i)?|aug(?:ustus)?|sep(?:tember|t)?|okt(? :ober)?|nov(?:ember)?|dec(?:ember)?))?(?: |-)?(?(3)(?: | at | ))?(?:([ 0-9]{1,2}:[0-9]{1,2})?(?: uur| u|u)?)?
以下文本的测试输出:
- 日期时间:2016 年 9 月 26 日 09:00 左右
- 日期时间:2016 年 9 月 1 日 09:00 uur
- 你的日期和时间:2018 年 9 月 1 日 09:00 你
- 没有日期的时间:08:30 uur
- 日期与时间 u:2016 年 9 月 1 日 09:00u
- 仅时间:09:00
- 仅一个月:一月
- 月份和年份:2019 年 2 月
- 只有一天:02
- 只有带“-”的一天:2-
- 日期和月份:1 月 2 日
- 月份年份:2018 年 1 月
- 带有“-”的日期:2-feb-2018 09:00
- 其他月份:2016 年 9 月 1 日
- 整月:2018 年 9 月 1 日
- 缩短年份:18 年 7 月
规则:
- 日期后跟时间有效
- 日期后跟文本“around”或“at”,后跟时间有效
- 没有天数的日期是有效的
- 没有年份的日期有效
- 仅日期、月份无效有效
- 一天,没有月份或年份无效有效
- 日期可能包含破折号“-”
- 一年可以用'缩短,比如
jun '18 - 月份名称可以长也可以短
- 完全匹配包括“uur”或“u”(以突出显示 ms-Word 中的文本)
- 捕获的子匹配文本没有前置或尾随空格
示例:[https://regex101.com/r/6CFgBP/1/]
预期输出(在 VBA Word 中使用时): 一个正则表达式匹配集合对象,其中每个 Match.SubMatches 包含来自正则表达式搜索字符串中捕获组的单个项目 d、m、y、hh:mm。 例如1:子匹配(或捕获组)包含值:'26'','sep','2016','09:00'
RegEx 工作正常,但需要排除一些误报:
- 如果某天没有月/年,则应从 Regex 中排除(示例 9 和 10)
- 如果有一个月没有一天,应该排除(示例7)
(我尝试使用 som 前瞻和引用 \1 和 ?(1),但无法使其正常运行...)
任何建议都非常感谢!
【问题讨论】:
-
你想从你的测试字符串中得到什么输出?
-
快速回复 :-) 我在 Matches.SubMatches VBA 对象中使用捕获组。因此,即对于第 1 项:Match 返回一个具有子匹配“26”、“sep”、“2016”、“09:00”的对象
-
试试this pattern。您可以分析子匹配并相应地构建您需要的结果。
-
感谢您查看该模式。示例 7、9 和 10 中仍然存在问题。我想不匹配这些项目的模式。
-
这不是正则表达式的问题。当您检查 submatches(x) 长度时,您可以轻松找出匹配时要保留和拒绝的内容。
标签: regex vba date time ms-word