2011-05-31 297 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