正则表达式中的匹配条件

时间:2011-12-29 21:06:09

标签: regex normalization street-address

前面只是一个注意事项:我是一个正念新手。也许对这个问题的一个好的答案是将我与一个解释这些条件如何起作用的资源联系起来:)

让我们说我有一个街道名称,如23rd St或5th St.我想摆脱诉讼“th”,“rd”,“nd”和“st”。怎么办呢?

现在我的表达式为:(st | nd | rd | th)。这个问题是它也会匹配包含“st”,“nd”,“rd”或“th”的街道名称。所以我真正需要的是一个条件匹配,它在自身之前寻找至少一个数字(即;第一个而不是街道)。

谢谢!

4 个答案:

答案 0 :(得分:5)

听起来你只想匹配序数后缀(st | nd | rd | th),是吗?

如果你的正则表达式引擎支持它,你可以使用lookbehind assertion

/(?<=\d)(st|nd|rd|th)/

仅当前面有数字(st|nd|rd|th)时匹配\d,但匹配不会捕获数字本身。

答案 1 :(得分:2)

你真正想要的是锚点。

尝试全球替换:

\b(\d+)(?:st|nd|rd|th)\b

第一组。

说明:

  • \b - &gt;匹配一个位置,其中一个单词字符(数字,字母,下划线)后跟一个非单词字符(没有前一个组),或相反;
  • (\d+) - &gt;匹配一个或多个数字,并在第一组($ 1)中捕获它们;
  • (?:st|nd|rd|th) - &gt;匹配任何st等... wihtout 捕获它((?:...)是非捕获组);
  • \b - &gt;见上文。

使用perl进行演示:

$ perl -pe 's/\b(\d+)(?:st|nd|rd|th)\b/$1/g' <<EOF
> Mark, 23rd street, New Hampshire
> I live on the 7th avenue
> No match here...
> azoiu32rdzeriuoiu
> EOF
Mark, 23 street, New Hampshire
I live on the 7 avenue
No match here...
azoiu32rdzeriuoiu

答案 2 :(得分:1)

尝试使用此正则表达式:

(\d+)(?:st|nd|rd|th)

我不认识红宝石。在PHP中我会使用类似的东西:

preg_replace('/(\d+)(?:st|nd|rd|th) /', '$1', 'South 2nd Street');

删除后缀

答案 3 :(得分:0)

删除序数:

 /(\d+)(?:st|nd|rd|th)\b/$1/

您必须捕获该号码,以便可以用它替换匹配。您可以捕获序数与否,除非您想将其输出到其他地方,否则无关紧要。

http://www.regular-expressions.info/javascriptexample.html