2015-07-17 4 views
1

Я извлекаю строку из pdf из этой строки Мне нужно получить список номеров отслеживания.C# Regex повторное совпадение между 2 литералами

Моя извлеченная строка подобна тому, что «текст больше» - это все остальная извлеченная строка.

другой текст ...__ FREIGHT: 0.00__SALES TAX: 0.00 __602256510000; 602256510002; 602256500001; ОТСЛЕЖИВАНИЕ ... больше текста

Я нахожу номера отслеживания в строке, сопоставляя «ОТСЛЕЖИВАНИЕ». Вот мой Regex:

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

Вот проблема:
после выполнения Группа Trackingnumber»содержит только последний идентификационный номер, но, как указано выше, в случае необходимости Группа„Trackingnumber“иметь 3 матча, один для каждый идентификационный номер (без завершающего «;» или пробел)

+0

наше регулярное выражение такой же, как https://regex101.com/r/cH1gS7/4. Вы не можете сделать это, как описано выше, но если вы используете не-жадный квантификатор. –

+0

Вы не можете сопоставить все индивидуальные совпадения для повторяющейся группы; вы всегда будете только соответствовать последнему. Вы должны извлечь их в два этапа: Извлеките последовательность, а затем разделите ее точкой с запятой. – poke

+0

try https://regex101.com/r/cH1gS7/5 –

ответ

0

это регулярное выражение может считать

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

Я обновил свой вопрос, можете ли вы расширить его для моих дополнительных требований? – Konrad

0

Я думаю, что это может помочь вам

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

И для лучшего проверки понимания этого: Regular Expression Lookahead

+0

это не дало 3 совпадения, только 2. 1) ОТСЛЕЖИВАНИЕ 2) 602256510000; 602256510002; 602256500001; (TrackingNumber) – Konrad

+0

sry ... я не хорошо прочитал ваш вопрос. Я обновился, чтобы соблюдать точные строки, которые вам нужны. – danvasiloiu

+0

ваше обновление дает слишком много совпадений: мне нужно остановить обратное совпадение, как только «__» будет сопоставлено. Вот больше строки ==> ...__ FREIGHT: 0.00__SALES TAX: 0.00__602256510000; 602256510002; 602256500001; TRACKING – Konrad

1

Вы можете попробовать ниже \G якорь на основе регулярных выражений

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

DEMO

+0

работает хорошо. но это не удается: hk__hkh__602256510000; 602256510002; 602256500001; ОТСЛЕЖИВАНИЕ hghg 65656676; ghg – Konrad

+0

Неправильное использование. Якорь '\ G' бесполезен, никогда не получается сопоставлен, и все это регулярное выражение использует взгляд на что-либо waaayyy .. вниз по течению, которое заканчивается на'; \ s * TRACKING.' – sln

+0

ya, вы правы. –

1

То, как его сделали в Dot-Net является использование Capture Коллекции


редактировать: - обратите внимание, что вы можете сделать трекинг символы факультативным
[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 
Смежные вопросы