为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式 - 在两者之间捕获未知数量的单词

正则表达式 - 在两者之间捕获未知数量的单词

C#
POPMUISE 2022-07-10 10:20:58
我有以下字符串2011 年的里雅斯特 MED 清洁/粗制/粗制2013 的里雅斯特 fo/crude/crude2013宁波东太平洋cca/cf/ce2014 Agioi theodoroi MED cde/fo/ce我真正想做的是尝试将的里雅斯特 MED(第一弦)、的里雅斯特(第二弦)、宁波东太平洋(第三弦)和 agioi theodoroi med(第四弦)作为一个称为开放端口的组。通常在日期 2013 和原油/原油/原油之间有 1 到 4 个单词。这是我迄今为止尝试过的https://regex101.com/r/mYevqd/1。但这很容易出错,因为我只假设开放端口组的单词由一个或两个最大空格分隔这是错误的。如果我尝试放置 \s* 则将捕获 clean 的第一个字母,这是错误的。有更好的吗?
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

你可以用这个简化你的正则表达式,

^(?<YearBuilt>\d{4})\s+(?<OpenPort>.*)\s+(?<LastCargos>[^ ]+)$

由于您在字符串中的第一件事是一年,因此使用\d{4}并且您要分组的最后一件事是这样的clean/crude/crude,您可以将其捕获为 this [^ ]+(除空格以外的任何内容),然后可以使用以下示例Ningbo East Pacific捕获中间文本.*

演示

让我知道这是否适用于其他字符串。


查看完整回答
反对 回复 2022-07-10
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果你允许我...


并非每个基于文本的问题都需要使用正则表达式。很多时候,您可以只使用 egSplit()和其他一些目的驱动的语句来实现您的目标。这比试图击败有时无法阅读的正则表达式提交要容易得多(并在 6 个月后阅读)。


就是这样:


public static void Main()

{

    var strings = new[] {"2011 Trieste MED clean/crude/crude",

                         "2013 Trieste fo/crude/crude",

                         "2013 Ningbo East Pacific cca/cf/ce",

                         "2014 Agioi theodoroi MED cde/fo/ce"};


    foreach (var s in strings)

        Console.WriteLine(GetName(s));

}


public static string GetName(string s)

{

    var allWords = s.Split(' ');

    var nameWords = allWords.Skip(1).Take(allWords.Length - 2);

    return string.Join(" ", nameWords);

}

Skip()并且Take()是 Linq 扩展方法,在添加using System.Linq;到 C# 文件后可用。


看到它运行: https ://dotnetfiddle.net/FTBcfC


查看完整回答
反对 回复 2022-07-10
?
慕的地10843

TA贡献1785条经验 获得超8个赞

var strings = new[] {

    "2011 Trieste MED clean/crude/crude",

    "2013 Trieste fo/crude/crude",

    "2013 Ningbo East Pacific cca/cf/ce",

    "2014 Agioi theodoroi MED cde/fo/ce"

};

var pattern = @"^\d+\s+(.+)(?=\s+.*?/)";

foreach (var s in strings)

{

    var match = Regex.Match(s, pattern);

    if (match.Success)

        WriteLine(match.Groups[1].Value);

    else

        WriteLine("No matches found.");

}

/*

Output:

    Trieste MED

    Trieste

    Ningbo East Pacific

    Agioi theodoroi MED

*/


查看完整回答
反对 回复 2022-07-10
  • 3 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号