2011-05-31 217 views
4

我需要通过正则表达式去除序号,但我的正则表达式技巧相当缺乏。以下是找到的序号,但是包含之前在返回值中的数字。我需要隔离并删除序号。正则表达式来删除序号

[0-9](?:st|nd|rd|th) 
+1

没有正则表达式的标准..你想从Perl中使用它, JavaScript,csharp或bash? – 2011-05-31 02:06:51

+0

@raj你忘了Java,Python和Erlang等等 – 2011-05-31 02:08:04

+0

@Jarrod只有语言我才有信心回答:)。不是一个僧侣。 – 2011-05-31 02:11:42

回答

10

您需要使用look-behind assertion,以便只匹配st|nd|rd|th前匹配[0-9],但[0-9]未包含在匹配中。即:

(?<=[0-9])(?:st|nd|rd|th) 

我已经联系到Perl兼容的语法,但如果你使用POSIX,POSIX扩展,vi或者你需要查找的语法许多其他的正则表达式语法之一。

+0

另外,[PHP文档](http://php.net/manual/en/regexp.reference.assertions.php)有一个更罗嗦的解释,如果你想要更多的概念背景(PHP的PCRE功能使用相同的语法如Perl)。 – joelhardi 2011-05-31 02:26:00

+1

与Ruby搭配出色。考虑在正则表达式选项中添加大小写不敏感,以便匹配85th和85TH:/(?<= [0-9])(?:stndnddth)/ i'。 – Avishai 2012-05-29 10:40:41

0

尝试负回顾后:

(?<=[0-9])(?:st|nd|rd|th) 

假设正则表达式的方言支持它。

3

在Perl中:

$var =~ s{\b(\d+)(?:st|nd|rd|th)\b}{$1}; 

在PHP:

$var = preg_replace('/\\b(\d+)(?:st|nd|rd|th)\\b/', '$1', $var); 

在.NET中:

var = Regex.Replace(@"\b(\d+)(?:st|nd|rd|th)\b", "$1"); 
+0

谢谢,.NET的工作完美无瑕! – Zachar543 2013-06-20 21:58:14