Соответствует любому символу, но не пустым и не только пробел - PullRequest
4 голосов
/ 03 мая 2019

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 03 мая 2019

Если это 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 голосов
/ 03 мая 2019

Использование

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

См. Демоверсию regex и график Regulex :

enter image description here

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

1 голос
/ 03 мая 2019

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

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

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

1 голос
/ 03 мая 2019

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

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

enter image description here

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

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

enter image description here

Или вы можете сделать то же самое с вашим исходным выражением, как это выражение : enter image description here

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