我需要通过正则表达式删除序数,但我的正则表达式技能非常缺乏。下面的代码定位序数,但在返回值中包含前面的数字。我需要隔离并删除序数。
[0-9](?:st|nd|rd|th)
您需要使用 look-behind 断言,以便仅匹配前面带有
st|nd|rd|th
的 [0-9]
,但 [0-9]
不包含在匹配中。即:
(?<=[0-9])(?:st|nd|rd|th)
我已经链接到与 perl 兼容的语法,但如果您使用 posix、posix Extended、vi 或许多其他正则表达式语法之一,您需要查找语法。
在 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-9]+(?:st| st|nd| nd|rd| rd|th| th)
因此,对于给定的文本: “第三个人失踪,但第二个人和第一个人在这里” 您将得到以下输出: “人失踪了,但他在这里”
尝试消极回顾:
(?<=[0-9])(?:st|nd|rd|th)
假设正则表达式的方言支持它。
我遇到这个问题,因为我需要用点替换序数,i。 e.
1.
、2.
、4.
等
这里是这个问题的解决方案(PHP):
$entry = preg_replace('/^\d+\. /', '', $entry);
有人可以提供不区分大小写的版本吗?我在 Python 中尝试了下面的方法,但它不起作用(但是区分大小写的版本可以工作)。