【问题标题】:RegEx do not match group with following \.\d正则表达式与以下 \.\d 不匹配组
【发布时间】:2012-01-22 17:41:08
【问题描述】:

我尝试在不同的文本中查找地址。它工作得很好,除了它还匹配一个单词后跟一个日期(foobar 22.01.2012 => address: foobar 22) 所以我想改进正则表达式,让街道号码后面不能跟“(.|:)\d”

这就是我所拥有的:

(?<str>\b([a-zA-Z]+-*[a-zA-Z]+(-|\s)*([a-zA-Z]|-)+)\b\.?\s{1})(?<no>\d+(\s?[a-zA-Z])?\b)

有代表性的文字:

咨询时间
星期一,06.02。直到星期五,2012 年 2 月 10 日和
星期一,13.02。直到 2012 年 2 月 14 日星期二,
每14.00-15.30点,二楼,
Am Fasanengarten 12 foobar
Schlossstr. 34

应该找到什么?
Am Fasanengarten 12
Schlossstr. 34

发现了什么?
06
10
13
14
每个 14
Am Fasanengarten 12
foob​​ar // 为什么这是一个匹配项?没有号码?
Schlossstr. 34

我尝试了不同的正面/负面的lookbehinds/-aheads,但没有运气。

【问题讨论】:

  • 应该如何将“Am Fasanengarten 12 Scholossstr. 34”与文本的其余部分区分开来?它有由字母字符、数字和句点组成的单词,每个单词用空格分隔。整个文本也是如此。单词大写的事实是否应该很重要? -- 我认为你可以从中吸取教训:每当你开始编写一个正则表达式时,你需要非常清楚你想要匹配什么和不想匹配什么。

标签: c# .net regex street-address


【解决方案1】:

在这里试试

(?<str>\b(?:[a-zA-Z]+-*[a-zA-Z]+(?:[ \t-])*(?:[a-zA-Z]|-)+)\b\.?\s)(?<no>\d+(?:\s?[a-zA-Z])?\b)(?![.:]\d)

here on Regexr

最后的否定前瞻(?![.:]\d) 确保没有“。”并且没有“:”,前面是\d

foobar // 为什么这是一个匹配项?没有号码?
Schlossstr. 34

这是一个匹配项,因为您允许在街道名称的单词之间使用\s

(?<str>\b([a-zA-Z]+-*[a-zA-Z]+(-|\s)*([a-zA-Z]|-)+)\b\.?\s{1})(?<no>\d+(\s?[a-zA-Z])?\b)
                                 ^^ here

我在我的解决方案中将其替换为 [ \t-],这仅允许空格、制表符和连字符。

\s 是“空白”,它还包含换行符,因此它与 foobar 匹配,如果您查看该组,您会看到它与地址“foobar Schlossstr. 34"

【讨论】:

  • 非常感谢,斯特马!现在看起来完美无瑕! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多