Регулярное выражение для нерегулярно повторяющейся строки - PullRequest
1 голос
/ 30 июня 2011

Я искал, но не нашел ответа на вопрос - возможно, это настолько очевидно, что никто не должен был спрашивать ...

Я использую UltraEdit 16.00, чтобы запустить Regular Expressions in PERL mode ...

Ситуация:

У меня есть строка с разделителями, которая может содержать переменное количество повторяющихся сегментов, которые должны соответствовать очень специфическому формату.Эти сегменты встречаются случайным образом по всей строке с разделителями.

Пример:

CLP*data*data*data~REF*data*data~N1*data*data*data~**CAS*OA*29*99.99**~AMT*I*99.99~SVC*data*data*data*data~**CAS*PR*99.99**~**CAS*CO**99.99**~DTM*150*date~AMT*B6*99.99~SVC*data*data*data*data~CAS*PR*N16*99.99~**CAS*CO* *99.99**...line continues from here.

Правильный формат - CAS*OA*29*99.99~
Неверный формат 1 - CAS*OA* *99.99~
Неверный формат 2 - CAS*OA**99.99~

Цель:

Определитьтолько те строки, где ВСЕ сегменты CAS придерживаются формата.

Вещи, которые я пробовал:

(Кстати: я знаю, что мои регулярные выражения не оптимизированы, поэтому, пожалуйста, дайте мне перерыв)

Сегмент CAS отсутствует или содержит одноили более пробелов

CAS\*(OA|PR|CR|CO)\*\*[-]?[\d]+\.?[\d]{0,2} ~ соответствует первому экземпляру, если находки
CAS\*(OA|PR|CR|CO)\*[\s]+?\*[-]?[\d]+\.?[\d]{0,2} ~ соответствует первому экземпляру, если найдены

CAS сегмент НЕ отсутствует или содержит пробел (ы)

CAS\*(OA|PR|CR|CO)\*[^0-9A-Z]+?\*[-]?[\d]+\.?[\d]{0,2}~ Опять же, соответствует первому экземпляру

Отрицательный взгляд вперед с использованием комбинаций выше (я новичок в этом подходе)

^(?:(?!ab).)+$ - ab =>one of the above regular expressions - никогда не заставлял его работать

Вопрос:

Как мне написать регулярное выражение для принудительного применения / проверки формата экземпляра КАЖДОГО CAS, независимо от того, как часто это происходит (естьпотенциал для 0 экземпляров)?

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Сказать, что каждый экземпляр CAS в вашей строке является допустимым, означает, что не существует хотя бы одной недопустимой последовательности CAS.Подход, к которому вы подходили с негативным прогнозом, является самым простым способом представить это - вот пример:

/^(?!.*CAS(?!<whatever matches a valid CAS instance>))/

В основном: «Убедитесь, что в строке не существует экземпляр CAS, которыйсопровождаемый тем, что соответствует действительному экземпляру CAS ".Замените содержимое второго отрицательного контекста и включите все, что находится перед «CAS», что указывает на начало экземпляра CAS.

Как видите, вам не нужно сопоставлять строку от начала дозаканчивай делать что хочешь.

0 голосов
/ 30 июня 2011

Эта идея обеспечит правильность всей строки.EG Это не будет соответствовать строке, если это не правильно.

^(regexThatOnlyMatchesASingleCorrectInstance)*$

Это начинается в начале строки ^ и совпадает с максимально возможным количеством + из regexThatOnlyMatchesASingleCorrectInstance и гарантирует, чтоконец строки $ находится сразу после последнего.

Конечно, это будет работать только тогда, когда в конце строки будет ~.Для части ~ используйте это: (?:~|$), чтобы вам не требовался разделитель в конце строки.

...