【问题标题】:Match any character but no empty and not only white spaces匹配任何字符,但不匹配空格,而不仅仅是空格
【发布时间】:2019-05-02 23:46:55
【问题描述】:

我有这个正则表达式:

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

它匹配两个标签之间的任何字符。匹配的问题也是空内容或标签内的空白,例如:

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

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

【问题讨论】:

  • 如果标签内容总是以字母数字字符开头,可以使用单词边界:\[tag\]\s*(\b.*?)\[\/tag\]

标签: regex


【解决方案1】:

使用

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

查看regex demoRegulex graph

(?!\s*\[\/tag\]) 是一个负前瞻,如果在当前位置的右侧有 0+ 个空格 [/tag],则匹配失败。

【讨论】:

  • 太复杂了
  • @KirillPolishchuk 但这是唯一的方法。可能\[tag\](?!\s*\[)(.*?)\[\/tag\] 也可以,但不太精确。
  • 感谢您的回复,请问您是如何生成此说明图的?
  • @Keaire 我的回答中有一个指向 Regulex 的链接。
【解决方案2】:

你可能会改变你的表达方式类似于this

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

你可以给它添加一个量词,并用字符数绑定它,类似于this expression

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

或者你可以对你原来的表达式做同样的事情,如this expression

【讨论】:

    【解决方案3】:

    试试这个regex:

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

    此正则表达式仅在 tag 至少有一个非空白字符时才匹配。

    【讨论】:

      【解决方案4】:

      如果这是 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\]
       )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多