0

我正在尝试使用短语“Ticket ID: (20 digit number)”提取票号这个短语可以写成:

  • “票号:(20位数字)”
  • "TicketID:(20 digit number)" - 空格无关紧要

这是我正在使用的无法正常工作的正则表达式字符串。我试图了解我在这里做错了什么。这个正则表达式应该寻找任何没有空格的短语,其中包含单词 Ticket 后跟 ID: 后跟任何类型的 20 位数字。

Regex newExpression = new Regex(@"\bTicket\b.*\bID:\b.*\d{20}", 
                RegexOptions.IgnoreCase 
                | RegexOptions.Singleline
                | RegexOptions.IgnorePatternWhitespace);
4

4 回答 4

1

使用此模式,您可以直接获得数字,因为后向(?<=..)只是一个检查,不在匹配结果中:

Regex newExpression = new Regex(@"(?<=\bTicket\s*ID\s*:\s*)\d{20}", 
            RegexOptions.IgnoreCase);
于 2013-07-10T02:08:58.957 回答
1

单词边界不会出现在:. 只需使用\s*忽略空格:

Regex newExpression = new Regex(@"Ticket\s*ID:\s*(\d{20})");

现在您可以使用newExpression.Match(someString).Groups[1].Value.

于 2013-07-10T02:13:37.320 回答
0

好吧,你可以试试这段代码。它捕获 20 位数字作为命名捕获组在Regex

var newExpression = new Regex(//@"\bTicket\b.*\bID:\b.*\d{20}", 
                @"Ticket\s*ID\:\s*(?<num>\(\d{20}\))",
                RegexOptions.IgnoreCase 
                | RegexOptions.Singleline
                | RegexOptions.IgnorePatternWhitespace);

var items=new List<string>();
var r=new Random();
var sb=new StringBuilder();
var i=0;
var formats=new []{"TicketID:({0})", "Ticket ID:({0})", "Ticket ID: ({0})", 
               "Ticket ID: ({0})"};
for(;i<5;i++){
    for(var j=0;j<20;j++){
        sb.Append(r.Next(0,9));
    }
    items.Add(string.Format(formats[r.Next(0,4)],sb));
    sb.Remove(0,20);
}

for(;i<10;i++){
    for(var j=0;j<20;j++){
        sb.Append(r.Next(0,9));
    }
    items.Add(string.Format(formats[r.Next(0,2)],sb));
    sb.Remove(0,20);
}

for(;i<15;i++){
    for(var j=0;j<20;j++){
        sb.Append(r.Next(0,9));
    }
    items.Add(string.Format(formats[r.Next(0,2)],sb));
    sb.Remove(0,20);
}

foreach(var s in items){
    var m = newExpression.Match(s);
    if(m.Success && m.Groups!=null && m.Groups.Count>0){
        string.Format("{0} - {1}",s,m.Groups["num"].Value).Dump();
    }
}

注意:这是在 Linqpad 中运行的。

于 2013-07-10T02:23:15.727 回答
0

只需跳过:or之前的所有内容:,例如

@".*\s*\d{20}"
于 2013-07-10T02:13:22.427 回答