Регекс включает в себя два матча в первом матче

У меня есть это регулярное выражение, которое пытается найти отдельные 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]*?) содержит отрицательный символ, совпадение будет неудачным.

Вы можете попробовать это:

#(\d+)\s*=\s*([a-z0-9]+)\s*\([^;]*\);

Ваша обновленная ссылка

Другие вопросы по тегам