【发布时间】:2016-05-04 15:09:37
【问题描述】:
我正在尝试在 .NET 中编写一个匹配客户/事务编号的正则表达式。客户编号或案件编号由一系列字母或数字组成,客户/案件编号是客户编号和案件编号的组合,由/、- 或. 分隔。例如0204A/101。
在以下字符串中:
Foo [1234/101] bar 456B/102 baz
我希望它与 [1234-101] 和 456B/102 匹配。为此,我想出了这种模式:
[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)[^a-zA-Z0-9]*
我可以使用捕获组从每个匹配项中提取客户/事项编号。
问题是:我想排除日期,以便日期的前两个部分或后两个部分不会被误解为客户/事项编号匹配。例如,如果我的字符串中有 5/3/2016 ——“Foo [1234-101] bar 456B/102 baz 5/3/2016”,我不希望 5/3/ 匹配。为了解决这个问题,我首先尝试将/\.\- 添加到最终否定范围的末尾:
[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)[^a-zA-Z0-9/\.\-]*
这不起作用,因为我的量词 * 是零或更多,所以它只是将否定范围视为出现零次并匹配 5/3。接下来,我尝试使其否定范围出现一次或多次,或者遇到字符串的结尾:
[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)([^a-zA-Z0-9/\.\-]+|$)
但是,这只是匹配 /3/2016,这是有道理的。
如何调整我的模式以匹配一个实例但在重叠实例上失败?例如,我希望它匹配foo 5/3 bar 中的5/3 和foo 3/2016 bar 中的3/2016,但不匹配foo 5/3/2016 bar 中的5/3/ 或/3/2016。
【问题讨论】:
-
解释否决票。