2015-04-24 2 views
0

На работе мне нужно регулярное выражение для соответствия различным видам продуктов в огромном старом каталоге, который был импортирован с цифровой поддержкой очень плохо (много ошибок, разные стили и т. Д.). Во время сопоставления я должен фиксировать тип продукта и его диаметр (значение внутри скобки). Наконец, я должен отменить неправильные форматированные записи (например, те, у которых плохие отформатированные комментарии).расширенное условное регулярное выражение с несколькими захватами и поисковыми окнами

Я новичок в регулярном выражении, и эта задача занимает у меня слишком много времени на мое планирование. На самом деле нужна помощь!

Вот что я должен и не должен соответствовать:

YES: "product type1(0)" 
YES: "product type2(923)"  
YES: "product type3(10)" 
YES: "product type4(110.023) :here is a comment. It always starts with a semicolon" 
YES: "product type1(14.4):comments can be just after product entry" 
YES: "product type1(10.0) : spaces are not relevant" 
YES: "product type1(0000.01) : this kind of entry is acceptable" 

NO: "product type1(asd)" 
NO: "product type1(12a3.02)" 
NO: "product type2(0.)" 
NO: "product type2(0.123.123)" 
NO: "product type2(0...)" 
NO: "product type3(0.asd)" 
NO: "product type4(10)" comment doesn't start with a semicolon 

Вот моя попытка. Я знаю, что мне нужно улучшить его с помощью шаблонов и взглядов. Мои проблемы возникают именно тогда, когда я пытаюсь использовать условное регулярное выражение, которое олицетворяет образы. Простое объяснение приветствуется.

^product (type1|type2|type3|type4)\(([0-9]+\.?[0-9]+)\)[ ]+;? 

спасибо.

+0

В .NET вы также можете использовать '(? m)" (тип продукта [1-4] \ (\ d + (?: \. \ d +)? \) (? (\ s *:) \ s *: [^ "] *?) | \ s *)" \ s * (? = $ | \ p {Zl}) 'с условным выражением (если вы заинтересованы, я буду пост в качестве ответа). См. Http://goo.gl/gE7Dk0. –

ответ

2

Вы можете использовать следующее соответствие:

^"(product\stype[1234]\(\d+(?:\.\d+)?\))\s*(:.*?)?"$ 

и заменить матчи с $1

Объяснение:

  • ^"(product\s начать с цитатой, открытой группой захвата, а затем product , а затем space

  • type[1234] с последующим type и любой из четырех цифр

  • \(\d+(?:\.\d+)?\)) с последующим буквальным ( и любое количество цифр, а затем ноль или один вхождение десятичной части (точка и цифры), близкого захвата группы

  • \s*(:.*?)?"$ дополнительный пробел, а затем комментарии могут или не могут быть ?, а затем котировки и в конце строки (ничего послесловие)

См DEMO and more Explanation

0

Это регулярное выражение работает для меня:

^product (type[1234])\((\d+(\.\d+)?)\)\s*(:.*)?$ 

Первая группа захвата должна иметь тип, а второй должен иметь диаметр.

Для того, чтобы разбить его:

[начало строки якоря] [буквальная: "Продукт"] [буквальный: "типа"] [1, 2, 3, или 4] [буквальная открывающая скобка] [по крайней мере одна цифра] [необязательно десятичная точка и хотя бы еще одна цифра] [буквальная закрывающая скобка] [любая сумма (включая 0 символов) пробела] [опционально двоеточие, за которым следует что-либо] [конец строки привязки]

0

Мое решение было бы

^product type[1234]\((?<num>\d+(?:\.?\d+)?)\)\s*(?:$|:+) 

который похож на другие решения, но выбирает число в скобки в названную группу «num»

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