匹配任何字符,但不能有空且不仅限于空格

时间:2019-05-02 23:46:56

标签: regex

我有这个正则表达式:

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

它匹配两个标签之间的任何字符。匹配空内容或标记内仅包含空格的问题,例如:

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

如何避免呢?使它至少与1个字符匹配,而不仅仅是空格。谢谢!

4 个答案:

答案 0 :(得分:2)

使用

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

请参见regex demoRegulex graph

enter image description here

如果(?!\s*\[\/tag\])是否定的超前查询,如果紧接当前位置右侧的空格有0+个空白,[/tag],则匹配失败。

答案 1 :(得分:2)

如果这是PCRE(或php),NP ++或Perl,请使用

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

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

如果没有,您将无法使用Stribnetz regex,这是因为
您的要求很奇怪。

可读

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

答案 2 :(得分:1)

您可以将表达式更改为类似于this的内容:

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

enter image description here

,您可以向其添加一个量词,并将其与字符数绑定,类似于this expression

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

enter image description here

或者您可以对原始表达式做与this expression相同的操作: enter image description here

答案 3 :(得分:1)

尝试以下regex

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

此正则表达式仅在具有至少一个非空白字符的情况下才与tag匹配。