【问题标题】:C# Regex Matching, NameC# 正则表达式匹配,名称
【发布时间】:2016-01-22 09:52:32
【问题描述】:

我在普通快递方面很糟糕,需要一些帮助。

我得到类似“Tell:IIDString: 456456456:Somebody's Name " 的字符串,但有时数字为零。此外,名称总是以空格结尾。我想提取名称并认为正则表达式是可行的方法,但我似乎无法让它工作。

static void Main(string[] args)
{
    string txt = "Tell:IIDString: 456456456:Somebody's Name ";
    // txt = "Tell:IIDString: 0:Somebody's Name ";'
    Match m = Regex.Match(txt, @"Tell:IIDString: \d+:([A-z\']+)\.\w", RegexOptions.IgnoreCase);

    if (m.Success)
    {
        Console.WriteLine(m.Value);
    }
}

【问题讨论】:

  • 我认为 \.\w 最后会导致问题。还要在[A-z\' ] 中添加空格(因为名称之间可以有空格)并改为打印m.Groups[1].Value
  • 我试过 "Tell:IIDString: \d+:([A-z\' ]+)" 会匹配,但不提取名称
  • 如果您的输入字符串格式始终相同,您可以拆分字符串并在不使用正则表达式的情况下获取名称值。 string txt = "Tell:IIDString: 456456456:Somebody's Name";字符串名称 = txt.Split(':')[3];
  • Console.WriteLine(m.Value); 将打印整个字符串,因为它是第一个匹配项。您在模式([A-z\']+) 中使用组,因此您必须打印Console.WriteLine(m.Groups[1].Value)
  • 只需在模式末尾放置空格。 "Tell:IIDString: \d+:([A-z\' ]+) "

标签: c# .net regex string


【解决方案1】:

这是一个匹配整个示例输入、捕获名称并对其进行修剪的正则表达式:

^Tell:IIDString:\s*\d+:(?<name>[A-Z' ]+?)\s*$

IDEONE demo:

string txt = "Tell:IIDString: 456456456:Somebody's Name ";
Match m = Regex.Match(txt, @"^Tell:IIDString:\s*\d+:([A-Z' ]+?)\s*$", RegexOptions.IgnoreCase);
if (m.Success)
   Console.WriteLine(m.Groups["name"].Value); // Note the group is referred by its name

正则表达式匹配:

  • ^ - 字符串开始
  • Tell:IIDString: - 给定字符的文字序列
  • \s* - 0 个或多个空格符号
  • \d+: - 1 个或多个数字后跟 :
  • (?&lt;name&gt;[A-Z' ]+?) - 一个命名的捕获组,我们稍后将通过名称引用它,匹配 1 个或多个拉丁字符、撇号和文字空格(如果可能有任何空格,则替换为 \s\p{Zs} 如果只有水平允许空格)
  • \s*$ - 字符串末尾有 0 个或多个空格符号($ 是行尾锚点)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2013-12-04
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多