Как исправить регулярные выражения, не соответствующие, когда символ является первым в новой строке? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть регулярное выражение, которое я использую для идентификации текста, который соответствует правилу форматирования уценки, в окружении звездочек.

Я проверяю, чтобы звездочки не только окружали текст, но чтобы следующие звездочки были следующимик тексту.например, *bold* должно работать и * not bold * не должно, чтобы избежать попадания обычных звездочек в форматирование.

Теперь это мое регулярное выражение: \*[^ ][^*]+.[^ ]\*

Проблемаэтот текст является положительным соответствием:

*Test
ing*

И это не так:

*Test
g*

Оба примера должны соответствоватьвыражение.

Я использую regex101.com для проверки.

Есть идеи?

Заранее спасибо!

Ответы [ 3 ]

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

Следующее регулярное выражение соответствует обоим вашим тестам:

\*[^ *]+.*?[^ ]\*

Кроме сайта https://www.freeformatter.com/java-regex-tester.html (который я использовал для проверки вашего исходного регулярного выражения), это также отличное место для разработки и тестирования регулярных выражений и средств их замены.

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

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

Используйте

\*[^* ](?:[^*]*[^ *])?\*

Или

\*[^*\s](?:[^*]*[^\s*])?\*

Эти регулярные выражения соответствуют строкам между звездочками, содержащими хотя бы один символ.

Детали

  • \* - звездочка
  • [^*\s] - любой символ, кроме звездочки и пробела
  • (?:[^*]*[^\s*])? - необязательная последовательность
    • [^*]* - ноль или более символов, кроме звездочки
    • [^\s*] - любой символ, кроме звездочки и пробела
  • \* - звездочка.
1 голос
/ 23 апреля 2019

Удаление точки, как прокомментировано @ wiktor-stribiżew, действительно решает проблему, но регулярное выражение может быть дополнительно упрощено до \*\S[^*]+\S\*.

Обратите внимание, что это регулярное выражение также будет соответствовать всей строке **Test**, то есть соответствует двойным звездочкам. Вы не указали свое предполагаемое поведение в этом случае.

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