我正在尝试使用短语“Ticket ID:(20位数字)”提取票号 这句话可以写成:
这是我使用的正则表达式字符串无法正常工作。我想知道我在这里做错了什么。这个正则表达式应该寻找任何不管空间的短语,单词Ticket后跟ID:后跟任意类型的20位数字。
Regex newExpression = new Regex(@"\bTicket\b.*\bID:\b.*\d{20}",
RegexOptions.IgnoreCase
| RegexOptions.Singleline
| RegexOptions.IgnorePatternWhitespace);
答案 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中运行的。