Регекс включает в себя два матча в первом матче
У меня есть это регулярное выражение, которое пытается найти отдельные STEP-строки и делит его на три группы ссылочного номера, класса и свойств:
#14=IFCEXTRUDEDAREASOLID(#28326,#17,#9,3657.6);
становится
[['14'], ['IFCEXTRUDEDAREASOLID'], ['#28326,#17,#9,3657.6']]
Иногда эти строки имеют произвольные разрывы строк, особенно среди свойств, поэтому я добавляю некоторые \s в регулярное выражение. Это однако делает для интересной ошибки. Теперь шаблон соответствует ДВА строки в каждом совпадении.
Как я могу настроить регулярное выражение, чтобы поймать только одну строку, даже если у них есть разрывы строк? И просто для любопытства, почему он останавливается после второй строки и не продолжается до последней строки?
2 ответа
Причина, по которой вы каждый раз сопоставляете две строки, заключается в том \s
соответствует любому пробелу, и если после совпадения есть разрыв строки, \s*
схватит их всех.
использование
/^#(\d+)\s*=\s*([a-zA-Z0-9]+)\s*\(((?:'[^']*'|[^;'])+)\);/gm
Смотрите это регулярное выражение
Детали:
^
- начало строки#
- символ хеш(\d+)
- Группа 1: одна или несколько цифр\s*=\s*
- а=
заключены в необязательные пробелы([a-zA-Z0-9]+)
- Группа 2 захватывает 1+ алфавитно-цифровые\s*\(
- 0+ пробелов и(
((?:'[^']*'|[^;'])+)
- Группа 3 захватывает либо'...'
подстроки ('[^']*'
без'
внутри разрешено) или (|
) 1+ символов кроме;
а также'
([^;']+
)\);
- а);
последовательность
Решение с использованием класса отрицанных символов, предложенное Maverick_Mrt, хорошо для конкретных случаев, но после того, как текст захвачен с ([\s\S]*?)
содержит отрицательный символ, совпадение будет неудачным.