用于短语的正则表达式字符串

时间:2013-07-10 01:59:46

标签: c# regex

我正在尝试使用短语“Ticket ID:(20位数字)”提取票号 这句话可以写成:

  • “机票ID :( 20位数字)”
  • “TicketID :( 20位数字)” - 空格无关紧要

这是我使用的正则表达式字符串无法正常工作。我想知道我在这里做错了什么。这个正则表达式应该寻找任何不管空间的短语,单词Ticket后跟ID:后跟任意类型的20位数字。

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

4 个答案:

答案 0 :(得分:1)

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

Regex newExpression = new Regex(@"(?<=\bTicket\s*ID\s*:\s*)\d{20}", 
            RegexOptions.IgnoreCase);

答案 1 :(得分:1)

:之后不会发生单词边界。只需使用\s*忽略空格:

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

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

答案 2 :(得分:0)

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

@".*\s*\d{20}"

答案 3 :(得分: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中运行的。