У меня есть это регулярное выражение:

\[tag\](.*?)\[\/tag\]

Соответствует любому символу между двумя тегами. Проблема, которая совпадает также с пустым содержимым или просто пробелами внутри тегов, например:

[tag][/tag]
[tag]  [/tag]

Как я могу избежать этого? Сделайте так, чтобы он соответствовал хотя бы одному символу, а не только пробелам. Спасибо!

3
Keaire 3 Май 2019 в 02:46

4 ответа

Лучший ответ

Использовать

\[tag\](?!\s*\[\/tag\])(.*?)\[\/tag\]
       ^^^^^^^^^^^^^^^^

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

enter image description here

(?!\s*\[\/tag\]) - это отрицательный запрос, который не соответствует совпадению, если непосредственно справа от текущего местоположения имеется 0+ пробелов, [/tag].

2
Wiktor Stribiżew 3 Май 2019 в 00:23

Если это PCRE (или php) или NP ++ или Perl, используйте это

(?s)(?:\[tag\]\s*\[/tag\](*SKIP)(?!)|\[tag\]\s*(.+?)\s*\[/tag\])

https://regex101.com/r/aCsOoQ/1

Если нет, то вы застряли с помощью регулярного выражения Stribnetz, которое работает из-за
странное условие ваших требований.

Удобочитаемый

 (?s)
 (?:
      \[tag\]
      \s* 
      \[/tag\]
      (*SKIP) 
      (?!)
   |  
      \[tag\]
      \s* 
      ( .+? )                       # (1)
      \s* 
      \[/tag\]
 )
2
user557597user557597 3 Май 2019 в 01:30

Вы можете изменить свое выражение на что-то похожее на это:

\[tag\]([\s\S]+)\[\/tag\]

enter image description here

И вы можете добавить к нему квантификатор и связать его числом символов, аналогично этому выражению :

\[tag\]([\s\S]{3,})\[\/tag\]

enter image description here

Или вы можете сделать то же самое с исходным выражением, что и это выражение: введите описание изображения здесь

1
Emma 3 Май 2019 в 00:11

Попробуйте это регулярное выражение:

\[(tag)\](?!\s*\[\/\1\])(.*?)\[\/\1\]

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

1
Kirill Polishchuk 3 Май 2019 в 00:46