RegEx для сопоставления последовательностей операций - PullRequest
3 голосов
/ 27 апреля 2019

У меня есть операция с числами, подобная этой:

-2-28*95+874-1545*-5+36

Мне нужно извлечь операнды, не подразумеваемые в операции умножения с регулярным выражением:

-2
+874
+36

Я пробовал подобные вещибез успеха:

[\+,-]\d+(?=\+|-|$) 

Это регулярное выражение также соответствует -5, а

(?(?=\d+)[\+,-]|^)\d+(?=\+|-|$)

ничего не соответствует.

Как мне решить эту проблему?

Ответы [ 3 ]

1 голос
/ 28 апреля 2019

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

[+-]?\d+(?:\*[+-]?\d+)+|([+-]?\d+)

Пояснение

  • [+-]?\d+ Необязательно + или -, за которыми следуют 1+ цифр
  • (?:\*[+-]?\d+)+Повторите предыдущий шаблон 1+ раз с * с добавленным
  • | или
  • ([+-]?\d+) Захват в группе 1, соответствующий необязательным цифрам + или - и 1+

Regex demo

1 голос
/ 28 апреля 2019

Вы можете использовать

(?<!\*)[-+]\d*\.?\d+(?![*\d])

См. Демоверсию regex

Детали

  • (?<!\*) - (отрицательный взгляд за тем, чтобы убедиться, что текущая позиция) не сразу начинается с * char
  • [-+] - - или +
  • \d* - 0 или более цифр
  • \.? - опционально . char
  • \d+ - 1+ цифр
  • (?![*\d]) - сразу же не следует * или цифра.

См. График регулярных выражений:

enter image description here

1 голос
/ 28 апреля 2019

Этот RegEx может помочь вам захватить ваш нежелательный шаблон в одну группу () , тогда он оставит желаемый результат:

(((-|\+|)\d+\*(-|\+|)\d+))

enter image description here

Вы также можете использовать другие специфичные для языка функции, такие как (* SKIP) (* FAIL) или (* SKIP) (* F) и получить требуемый вывод

((((-|\+|)\d+\*(-|\+|)\d+))(*SKIP)(*FAIL)|([s\S]))

enter image description here

Вы также можете, если хотите, DRY и удалить ненужные группы, которые вам могут не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...