Автор Тема: мультистрочная регулярка  (Прочитано 203 раз)

Mafey

  • Newbie
  • *
  • Сообщений: 1
    • Просмотр профиля
мультистрочная регулярка
« : Апрель 17, 2018, 11:16:00 am »
Привет всем. Имеется текст:
N175 TRS()
N190 G53 G90 G0 Z20
N205 B0 C0
N220 T1000 M6
N235 M3 S14000
N250 MSG(D80-L80 Plane: )
N265 M31
N280 G53 G90 G0 G48 Z20
N250 MSG(D80-L80 Plane: 2)
N295 G47(,,ZTR) ED1
N310 G0 G58.3
N512 M31
N325 G0 X313 Y682
Задача состоит в том чтоб заменить M31 на M32 если: строчка заканчивается на Plane: ) и сразу же за этой строчкой следует строка которая заканчивается на M31.
Строка поиска: Plane:\s\)\r\n{1,1}[A-Z0-9\s]+M31$Проблема возникают после группировки подстрок(Plane:\s\)\r\n{1,1}[A-Z0-9\s]+M3)1$2 вышеуказанных выражения дают разные результаты

Arex

  • Jr. Member
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: мультистрочная регулярка
« Ответ #1 : Декабрь 04, 2018, 04:16:45 pm »
Честно говоря, почему по-разному обрабатываются, я точно не скажу, зато сразу вижу, что [A-Z0-9\s]+ - это крайне неудачная конструкция. Символ \s включает в себя не только пробел, но и табуляцию (\t), и перенос строки (\r и \n). Получается, эта конструкция включает в себя все строки подряд, где нет знаков препинания.

Кроме того, в данной программе весь текст обрабатывается не построчно, а целиком. То есть символы ^ и $ означают не начало и конец строки, а начало и конец текста. Так что ставить $ в конце выражения не нужно.

В общем, я бы предложил
(Plane: \)\r\n[^\n]*?M3)1\r\nзаменить на
${1}2\r\n