【问题标题】:Regular Expression to match last word when string starts with pattern当字符串以模式开头时,正则表达式匹配最后一个单词
【发布时间】:2018-09-07 13:50:56
【问题描述】:

我正在尝试创建一个正则表达式来匹配字符串的最后一个单词,但前提是字符串以特定模式开头。

例如,我只想在字符串以“The cat”开头时获取字符串的最后一个单词。

  • “猫吃黄油”-> 将匹配“黄油”。
  • “猫喝牛奶”->会匹配“牛奶”
  • “狗吃牛肉” -> 找不到匹配项。

我知道下面会告诉我最后一句话:

\s+\S*$

我也知道我可以使用正面的观察来确保字符串以某种模式开头:

(?<=The cat )

但我想不出将它们组合起来。

我将在 c# 中使用它,我知道我可以将它与一些字符串比较运算符结合起来,但我希望这一切都在一个正则表达式中,因为这是我将要使用的几个正则表达式模式字符串之一正在循环播放。

有什么想法吗?

【问题讨论】:

  • 使用(?s)(?&lt;=^.*)\b\w+$(.NET,PyPi 正则表达式)或(?s)^.*\K\b\w+$(PCRE,Ruby)
  • (?&lt;=^The cat.*)\b\w+$ 呢?
  • 是的,我忘了在上面的例子中输入The cat :)

标签: regex


【解决方案1】:

使用以下正则表达式:

^The cat.*?\s+(\S+)$

详情:

  • ^ - 字符串的开头。
  • The cat - “开始”模式。
  • .*? - 任意字符序列,不情愿的版本。
  • \s+ - 一系列“白色”字符。
  • (\S+) - 一个捕获组 - “非白色”字符序列, 这就是您要捕捉的内容。
  • $ - 字符串结束。

所以最后一个词将在第一个捕获组中。

【讨论】:

  • 这对我来说非常有效!是的,我确实更喜欢这个项目的正则表达式。
【解决方案2】:

这个呢?

^The\scat.*\s(\w+)$

【讨论】:

  • 差不多。只是他想要前缀“猫”,单词之间有一个简单的空格。您的解决方案还可以接受制表符、换行符和其他一些空格。
【解决方案3】:

我的正则表达式知识相当生疏,但你不能简单地在\s+\S*$ 的开头“添加”你正在寻找的单词,如果你知道这会返回最后一个单词吗? 然后是这样的(“\”应该是转义符号,所以它被读取为实际单词):

\T\h\e\ \c\a\t\ \s+\S*$

【讨论】:

  • 什么?不要那样做。
  • 我的意思是不要逃避每个字符。这不是必需的。例如,\t 是一个选项卡。
【解决方案4】:

没有正则表达式

不需要正则表达式。只需使用 C# 的 StartsWith 和 Linq 的 Split(' ').Last()

See code in use here

using System;
using System.Linq;
using System.Text.RegularExpressions;

class Example {
    static void Main() {
        string[] strings = {
            "The cat eats butter",
            "The cat drinks milk",
            "The dog eats beef"
        };
        foreach(string s in strings) {
            if(s.StartsWith("The cat")) {
                Console.WriteLine(s.Split(' ').Last());
            }
        }
    }
}

结果:

butter
milk

使用正则表达式

但是,如果您更喜欢正则表达式解决方案,您可以使用以下方法。

See code in use here

using System;
using System.Text.RegularExpressions;

class Example {
    static void Main() {
        string[] strings = {
            "The cat eats butter",
            "The cat drinks milk",
            "The dog eats beef"
        };
        Regex regex = new Regex(@"(?<=^The cat.*)\b\w+$");
        foreach(string s in strings) {
            Match m = regex.Match(s);
            if(m.Success) {
                Console.WriteLine(m.Value);
            }
        }
    }
}

结果:

butter
milk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 2010-11-17
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多