C#正则表达式重复2个文字之间的匹配

时间:2015-07-17 15:47:24

标签: c# regex

我从该字符串中提取pdf字符串,我需要获取一个跟踪号列表。

我提取的字符串就像这样“更多文本”是提取字符串的其余部分。

更多文字...... _货运:0.00__SALES税:0.00 __602256510000; 602256510002; 602256500001;跟踪...更多文字

我通过匹配“跟踪”找到字符串中的跟踪号码。 这是我的正则表达式:

((?<TrackingNumber>[a-zA-Z0-9]+);\s)+TRACKING

问题在于:
执行后,Group TrackingNumber“仅包含最后一个跟踪号码,但如上所述需要该组”TrackingNumber“有3个匹配,每个跟踪号码一个(没有尾随的”;“或空格)

4 个答案:

答案 0 :(得分:1)

您可以尝试以下\G基于锚定的正则表达式

(?:;\s|_)(?<TrackingNumber>[a-zA-Z0-9]+)(?=.*?;\s*TRACKING)

DEMO

答案 1 :(得分:1)

在Dot-Net中完成的方式是使用 Capture Collections

编辑: - 请注意,您可能希望将跟踪字符设为可选的 [a-zA-Z0-9]*如果中间有一个丢失/空白的号码 这将继续捕获 (例如:602256510000; 602256510002;; 602256500001; TRACKING

 # (?:(?<TrackingNumber>[a-zA-Z0-9]+);\s)+TRACKING

 (?:
      (?<TrackingNumber> [a-zA-Z0-9]+ )  #_(1)         
      ; \s 
 )+
 TRACKING

C#:

string pdf = "__602256510000; 602256510002; 602256500001; TRACKING ";
Regex RxTrack = new Regex(@"(?:(?<TrackingNumber>[a-zA-Z0-9]+);\s)+TRACKING");

Match trackMatch = RxTrack.Match( pdf );
if ( trackMatch.Success )
{
    CaptureCollection cc = trackMatch.Groups["TrackingNumber"].Captures;
    for (int i = 0; i < cc.Count; i++)
        Console.WriteLine("[{0}] = {1}", i, cc[i].Value);
}

输出:

[0] = 602256510000
[1] = 602256510002
[2] = 602256500001

答案 2 :(得分:0)

这个正则表达式可以接受它

(?<TrackingNumber>[\d]+)(?=;)

答案 3 :(得分:0)

我认为这可能对你有所帮助。

(?<TrackingNumber>[0-9]+)(?=.*?;\sTRACKING)

为了更好地理解,请检查: Regular Expression Lookahead