0

我正在尝试创建一个返回结果的模式,如下所示:

Help # 7256
Help # 83930
ph  # 7222
this is a test example
Help # 029299
New # 92929

输出 :

Help # 7256 
Help # 83930 
Help # 029299

以 Help 开头的任何内容,后跟 # 符号,然后是 3 、 4 、 5 位数值

我尝试过这样的事情

Regex pattern = new Regex(@"(Help #) (^|\D)(\d{3, 4,5})($|\D)");

有人可以帮我创建这个模式吗?(在 C# 中)

4

3 回答 3

3
/^Help\s*#\s*(\d{3,5})/gm

演示

我应该补充一点Help # 029299,即使它包含 6 个字符,它也与 OP 中指定的一样匹配。

如果您只想匹配 3 到 5 个字符,可以这样做:

/^Help\s*#\s*(\d{3,5})\b/gm

演示

注意:如果您只想匹配“ Help[SPACE]#[SPACE]number”,则只需删除所有\s*的。

于 2013-01-25T16:40:50.390 回答
2

一个简单的解决方案,假设您想要获取所有以开头的行Help #(不管它后面是什么),并且输入文件的格式是一致的:

if (currentLine.StartsWith(@"Help #"))
{
    // Do something with the line
}

String.StartsWith方法参考。

如果您想要正则表达式解决方案,这里是正则表达式(在文字字符串中):

@"^Help #\s+(\d+)"

这可以与Regex.Match(String)一起使用。您可以从捕获组 1 中选择号码。这个号码只会匹配以 开头的行,Help #后跟任意数量的空格,然后是至少 1 个数字。请注意,仅当您逐行扫描文件时才可以使用此正则表达式。

如果您必须将其限制为 3-5 位数:

@"^Help #\s+(\d{3,5})"
于 2013-01-25T16:40:36.173 回答
1

对于 C#,试试这个:

var list = new string[] { 
    "Help", "Help # 7256", "Help # 83930", 
    "ph # 7222", "this is a test example", 
    "Help # 029299", "New # 92929",
    "Help # 7256 8945", "Help # 83930 8998 787989"
};

// bear in mind that the $ at the end matches only these strings
// if you want it to match something like Help # 1284 12841 0933 SUBJECT HERE"
// then remove the $ from the end of this pattern
const string pattern = @"^(Help)\s#\s(\d{3,6})\s?(\d{3,6})?\s?(\d{3,6})?$";

var regex = new Regex(pattern);
foreach (string s in list)
{
    if (regex.Match(s).Success)
        Console.WriteLine(s);
}
Console.WriteLine("Done.");
Console.ReadKey();

输出:

Help # 7256
Help # 83930
Help # 029299
Help # 7256 8945
Help # 83930 8998 787989
于 2013-01-25T16:56:05.537 回答