2016-05-19 2 views
-3

Я хотел бы проверить линию, как это:Регулярное выражение для "|" отделенные значения

Price (sales)||ALL|Table|HOTP3060|General|3000||||B2B|BUC|149.9|RON|0|0|0|18.05.2016|31.12.2099|YES 

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

Ошибка должна быть замечена, если какая-либо из "|" не хватает.

Еще одна вещь, поля, содержащие 3000, 149,9, должны быть ограничены как десятичные числа.

псевдокод для этого, как я вижу это:

  • любые символы или отсутствуют | любые символы или отсутствующие | .... | dec значение или отсутствует |

    • и даты формат фиксирован: дд.мм.гггг

Я начал с:

[a-zA-Z()]+\|\|[a-zA-Z]+\|[a-zA-z]+\|[a-zA-Z0-9]+\| 

, но я не выяснить, как упомянуть о том, что некоторые данные могут отсутствовать.

Что-то вроде:

  • [A-Za-Z()] + символы или ничего |
    • [a-zA-Z0-9] + \ | символы и цифры или ничего |

OK я получил здесь:

[a-zA-Z()]+\|\|[a-zA-Z]+\|[a-zA-z]+\|[a-zA-Z0-9]+\|[a-zA-Z]+\|[0-9]+\|\|\|\|[a-zA-Z]+\|[a-zA-Z]+\|\d+(\.\d{1,2})\|[a-zA-Z]+\|\d+\|\d+\|\d+\|[0-9]+\.[0-9]+\.[0-9]+\|[0-9]+\.[0-9]+\.[0-9]+\|\w+ 

Все разбирается .. но, как мне кажется, довольно некрасиво ..

+0

ИМХО, ваш вопрос не показывает исследовательских усилий. Есть [много] (http://regexone.com/) мест, чтобы получить отправную точку ... – OzW

+0

Я начал с [a-zA-Z()] + \ | \ | [a-zA-Z ] + \ | обнаружение первых двух столбцов, но я не могу узнать, как указать «отсутствующий» вариант. –

+0

вы должны поставить это в свой вопрос :) – OzW

ответ

1

Прежде всего, создавать шаблоны для чисел: \d+(\.\d+)? и даты: \d\d\.\d\d\.\d{4}. Затем придумайте шаблон, соответствующий одному сегменту |: [^|]*|. Тогда просто объединить три модели по мере необходимости:

^        start of string anchor 
([^|]*\|){6}     match exactly 6 |-delimited segments 
(\d+(\.\d+)?)?    match a decimal number or nothing 
(\|[^|]*){5}     match exactly 5 |-delimited segments 
\|(\d+(\.\d+)?)?    match a | delimiter and if possible a number 
(\|[^|]*){4}     match 4 |-delimited segments 
(\|(\d\d\.\d\d\.\d{4})?){2} match a | delimiter and if possible a date. Two times. 
\|[^|]*      match one last | segment 
$        end of string anchor, makes sure we've matched the whole string 

Результат:

^([^|]*\|){6}(\d+(\.\d+)?)?(\|[^|]*){5}\|(\d+(\.\d+)?)?(\|[^|]*){4}(\|(\d\d\.\d\d\.\d{4})?){2}\|[^|]*$ 
+0

Спасибо за помощь, это работает. Я пытаюсь переварить это, хотя :) –

Смежные вопросы