【问题标题】:regex to remove ordinals正则表达式删除序数
【发布时间】:2011-05-31 02:04:28
【问题描述】:

我需要通过正则表达式删除序数,但我的正则表达式技能相当缺乏。下面定位序数,但在返回值中包含刚好在前面的数字。我只需要隔离并删除序数。

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

【问题讨论】:

  • 没有正则表达式标准。你想从 perl、javascript、csharp 还是 bash 中使用它?
  • @raj 你忘了 Java、Python 和 Erlang 等等
  • @Jarrod 只有我有信心可以回答的语言:)。不是学究。

标签: regex


【解决方案1】:

您需要使用look-behind assertion,以便仅匹配前面带有[0-9]st|nd|rd|th,但匹配中不包含[0-9]。即:

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

我已链接到与 perl 兼容的语法,但如果您使用的是 posix、posix extended、vi 或许多其他正则表达式语法之一,则需要查找语法。

【讨论】:

  • 另外,如果您想了解更多概念背景知识,PHP docs 的解释会稍微冗长一些(PHP 的 PCRE 函数使用与 Perl 相同的语法)。
  • 与 Ruby 完美配合。考虑为正则表达式选项添加不区分大小写,使其匹配 85th 以及 85TH: /(?&lt;=[0-9])(?:st|nd|rd|th)/i
【解决方案2】:

在 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");

【讨论】:

    【解决方案3】:

    如果您还想删除后跟序数的数字,您可以使用这个:

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

    所以对于给定的文本:“第 3 个人不见了,但第 2 个人和第 1 个人在这里” 你会得到这样的输出: “这个人不见了,但那个人和那个人在这里”

    【讨论】:

      【解决方案4】:

      尝试消极的向后看:

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

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

      【讨论】:

        【解决方案5】:

        我遇到了这个问题,因为我需要用点替换序数,i。 e. 1.2.4.

        这里是这个问题的解决方案(在 PHP 中):

        $entry = preg_replace('/^\d+\. /', '', $entry);

        测试:https://regex101.com/r/xLB6Ov/1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          相关资源
          最近更新 更多