2017-01-18 4 views
3

У меня есть this regex, который пытается найти отдельную STEP-линию и делит ее на три goups ссылочного номера, класс и свойства:Regex включает два матча в первом матче

#14=IFCEXTRUDEDAREASOLID(#28326,#17,#9,3657.6); 

становится

[['14'], ['IFCEXTRUDEDAREASOLID'], ['#28326,#17,#9,3657.6']] 

Иногда эти строки имеют произвольные разрывы строк, особенно среди свойств, поэтому я помещаю некоторые \ s в регулярное выражение. Это, однако, вызывает интересную ошибку. Шаблон теперь соответствует двум строкам в каждом матче.

Как настроить регулярное выражение только на одну строку, даже если у них есть разрывы строк? И только ради любопытства, почему он останавливается после второй линии и не продолжается до последней строки?

+1

Мне кажется, вы хотели использовать что-то вроде ['# (\ d +) \ s * = \ s * ([a-zA-Z0-9] +) \ s * \ (([\ s \ S ] *) \)? '] (https://regex101.com/r/RHIu0r/3). Или ['^ # (\ d +) \ s * = \ s * ([a-zA-Z0-9] +) \ s * \ (([\ s \ S] *?) \); $'] (https://regex101.com/r/RHIu0r/4) (с многострочной опцией). –

+0

@ WiktorStribiżew Спасибо большое! Кажется, это работает. Добавьте ответ, и я приму его как правильно.Бонусные очки для скорости :) – mottosson

+0

Да, конечно, я добавлю пояснения. –

ответ

2

Причина, почему вы теперь соответствуют 2 строки каждый раз, когда что \s соответствует любому пробельные, и если есть разрыв строки после строки совпадают, \s* захватит их всех.

Использование

/^#(\d+)\s*=\s*([a-zA-Z0-9]+)\s*\(((?:'[^']*'|[^;'])+)\);/gm 

См this regex demo

Детали:

  • ^ - начало линии
  • # - символ хэш
  • (\d+) - Группа 1: один или более цифр
  • \s*=\s* - это = заключен с дополнительными пробелами
  • ([a-zA-Z0-9]+) - Группа 2 захвата 1+
  • алфавитно-цифровые
  • \s*\( - 0+ пробельные и (
  • ((?:'[^']*'|[^;'])+) - Группа 3 либо '...' подстроки (, без ' внутри разрешено) или (|) 1+ символов, кроме ; и ' ([^;']+)
  • \); - это ); последовательность

Отрицающее решение персонажа класса suggested by Maverick_Mrt хорошо для конкретных случаев, но после того, как текст захвачен с ([\s\S]*?) содержит отрицание полукокса, матч будет получить не удался.

+0

Если мы рассмотрим шаблоны, я думаю, что это не так уж сложно считать, что ';' не будет существовать внутри скобки. –

+0

BTW, развернутая версия ['/^# (\ d +) \ s * = \ s * ([a-zA-Z0-9] +) \ s * \ (([^)] * (?: \) (?!; $) [^)] *) *) \); $/gm'] (https://regex101.com/r/ebOdJL/1) –

+0

@Maverick_Mrt: Я предпочитаю обобщенные подходы. Мы не знаем, всегда ли полуколонна отсутствует. Он выглядит как формула Excel (?), И в некоторых местах используется * полуколона * *. –

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

  • Нет связанных вопросов^_^