Формула регулярных выражений для `** abc_abc **` из строки`** abc_abc ** abc abc **abc_abc ** в Java

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть несколько строк, в некоторых случаях строка есть **abc_abc** , а в некоторых есть **abc_abc** abc abc abc **abc_abc** , мне нужно выбрать только одну пару «**» (so **abc_abc** ). До сих пор я использовал регулярное выражение, которое, казалось, работало нормально, но я только что заметил, что во втором примере оно подбирает все.

мое регулярное выражение до сих пор было:

 \*\*(.*?)_(.*?)\*\*
 

есть идеи о том, как получить только эту единственную пару звезд?

Любая помощь будет высоко оценена. Заранее спасибо 🙂

Комментарии:

1. С опубликованной вами строкой проблем нет, но вам, вероятно, понадобится \*\*((?:(?!\*\*)[^_])*)_(.*?)\*\* ( демо )

2. Да! Dziekuje! Если вы хотите отправить свой комментарий в качестве ответа, я могу пометить его как правильный 🙂

Ответ №1:

Чтобы избежать совпадения строк, начинающихся с «неквалифицированных» **...** , вам необходимо настроить первую группу с более конкретным шаблоном:

 **((?:(?!**)[^_])*)_(.*?)**
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • ** ** строка
  • ((?:(?!**)[^_])*) — Захват группы 1: любой символ, но _ который не запускает ** подстроку, ноль или более раз, как можно больше
  • _ _ символ
  • (.*?) — Захват группы 2: любых нулевых или более символов, отличных от символов разрыва строки, как можно меньше
  • ** ** строка

Объявление регулярных выражений Java:

 String regex = "\*\*((?:(?!\*\*)[^_])*)_(.*?)\*\*";