【问题标题】:Regex match pattern plus rest of the string until next dot, comma or space正则表达式匹配模式加上字符串的其余部分,直到下一个点、逗号或空格
【发布时间】:2021-04-17 09:25:24
【问题描述】:

假设我有一个字符串WORK-232-3213-2323。已知可能的案例场景:

WORK-232-3213-2323, some text
WORK-232-3213-2323. some text
WORK-232-3213-2323.xlsx
WORK-232-3213-2323 some text
WORK-232-3213-2323/some text

格式WORK-232-3213-2323-some text也有可能出现,不过这种情况不需要处理

我当前的正则表达式能够使用WORK-232-3213-2323 模式捕获所需的字符串,但作为输出我得到-232-3213-2323。如何让它在字符串中捕获WORK- 加上其余文本,直到下一个空格、点、斜杠或逗号?

当前正则表达式:WORK-(.*?)[\s]

C#:

Regex pattern = new Regex("WORK-(.*?)[\s]");
string result = pattern.Match(myString).Groups[1].Value

【问题讨论】:

  • 可能在\bWORK(?:-[0-9]+)+ 附近。您当前正在尝试检索捕获组 1 的值。
  • @"^(?'prefix'[^\d]+)(?'number'[^\s,\./]+)"

标签: c# .net regex


【解决方案1】:

您可以使用匹配而不使用捕获组,并使用不包括逗号、点或空白字符的否定字符类。

\bWORK-[^.,\s]+
  • \bWORK- 匹配 WORK 前面有一个单词边界以防止部分匹配
  • [^.,\s]+ Negated character class 匹配除. , 或空白字符之外的任何字符的1+倍

Regex demo

string[] strings = { 
    "WORK-232-3213-2323, some text",
    "WORK-232-3213-2323. some text",
    "WORK-232-3213-2323.xlsx",
    "WORK-232-3213-2323 some text",
    "WORK-232-3213-2323/some text"
    };
string pattern = @"\bWORK-[^.,\s]+";
foreach (String s in strings) {
    Console.WriteLine(Regex.Match(s, pattern).Value);
}

输出

WORK-232-3213-2323
WORK-232-3213-2323
WORK-232-3213-2323
WORK-232-3213-2323
WORK-232-3213-2323/some

如果您不想匹配最后一行,可以使用捕获组并在其后匹配 . , 或空白字符

\b(WORK-[^.,\s\/]+)[.,\s]

Regex demo

例如使用相同的示例字符串:

string pattern = @"\b(WORK-[^.,\s\/]+)[.,\s]";
foreach (String s in strings) {
    Console.WriteLine(Regex.Match(s, pattern).Groups[1].Value);
}

输出

WORK-232-3213-2323
WORK-232-3213-2323
WORK-232-3213-2323
WORK-232-3213-2323

【讨论】:

    【解决方案2】:

    在我看来,您可以使用以下模式来处理您的所有情况,包括可能发生的情况:

    \bWORK(?:-[0-9]+)+
    

    在线查看demo

    我不是 c# 的英雄,所以我使用了一些我能找到的代码来测试:

    using System;
    using System.Text.RegularExpressions;
    
    public class Program
    {
        public static void Main()
        {
            var s = @"WORK-232-3213-2323, some text";
            var pattern = @"\bWORK(?:-[0-9]+)+";
            
            Regex r = new Regex(pattern);       
            
            Match m = r.Match(s);
            if (m.Success) 
            {
                Console.WriteLine(m.Value);
            }
        }
    }
    

    或者,您可以使用 \bWORK(?:-\d+)+ 和使用带有 ECMAScript 选项集的 Regex r = new Regex(pattern, RegexOptions.ECMAScript);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 2015-10-04
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多