【问题标题】:Regex get all before first occurrence of character正则表达式在第一次出现字符之前获取所有内容
【发布时间】:2021-02-16 12:09:45
【问题描述】:

我知道它被问过很多次了。我尽力了,但结果并不完美。

正则表达式

/(\(\s*["[^']*]*)(.*\/logo\.png.*?)(["[^']*]*\s*\))/gmi

Regex101 链接:https://regex101.com/r/0f8Q08/1

它应该单独捕获所有内容。

(../asdasd/dasdas/logo.png) 
(../asdasd/dasdas/logo.png) 
( '../logo.png' ) 

现在它正在整体捕获。

(../asdasd/dasdas/logo.png) (../asdasd/dasdas/logo.png) ( '../logo.png' ) 

我需要的是,在第一个右括号 ) 匹配之后停止的正则表达式。

【问题讨论】:

  • 截图中的错误捕获
  • 你需要正则表达式吗?如果您正在寻找第一次出现的字符,大多数语言都有 indexOf
  • 需要正则表达式,因为我的并不完美
  • 喜欢这个? (\(\s*["[^']*]*)([^()]*\/logo\.png[^()]*)(["[^']*]*\s*\))regex101.com/r/D11pXu/1

标签: regex


【解决方案1】:

你可以使用

(\(\s*(["']?))([^"')]*\/logo\.png[^"')]*)(\2\s*\))

请参阅regex demo

详情

  • (\(\s*(["']?)) - 第 1 组:(,任意零个或多个空格,然后第 2 组捕获 '"(可选)
  • ([^"')]*\/logo\.png[^"')]*) - 第 3 组:除 "') 之外的任何零个或多个字符,然后是 /logo.png 字符串,然后是除 "' 之外的任何零个或多个字符和)
  • (\2\s*\)) - 第 4 组:与第 2 组中的值相同,零个或多个空格,以及一个 ) 字符。

【讨论】:

    【解决方案2】:

    您的模式中的问题是 .* 匹配太多。在左括号之后,您应该排除匹配 () 以过度匹配单独的部分。

    如果您想将带括号的部分作为一个整体进行匹配,则不需要所有这些捕获组。

    您可以使用 1 个捕获组,其中该组将是匹配相同可选结束引号的反向引用。

    \(\s*(["']?)[^()'"]*\/logo\.png[^()'"]*\1\s*\)
    

    Regex demo

    如果您还想要不带匹配引号的匹配项:

    \(\s*["']?[^()'"]*\/logo\.png[^()'"]*["']?\s*\)
    

    Regex demo

    【讨论】:

      【解决方案3】:

      如果您想使用正则表达式,您可以将 .* 更改为 [^)],这样您就可以留在括号之间

      (\(\s*["[^']*]*)([^)]*\/logo\.png.*?)(["[^']*]*\s*\))
      

      regex101

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        相关资源
        最近更新 更多