【问题标题】:Confusion regarding the *? regular expression operator关于 *? 的困惑正则表达式运算符
【发布时间】:2013-08-17 00:16:53
【问题描述】:

所以我想搜索一个字符串,使用下面的正则表达式:

border-.*\.5pt

在边框粗细为.5pt 的文件中查找所有border-topborder-bottom 等CSS 属性。它通常效果很好,但它太贪婪了。

例如,以下所有内容都作为单个匹配项返回:

border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt

我希望这两个 CSS 属性是两个单独的匹配项。

所以我尝试将我的正则表达式修改为:

border-.*?\.5pt

使用? 使其不贪婪。但是,在修改之后,没有任何匹配项。

谁能解释我为什么会看到这种行为?我错过了什么?

(如果值得了解的话,我在执行此搜索时使用了 Microsoft Expression Web 的“使用正则表达式查找”。)

【问题讨论】:

  • I can only tell that it works here,所以可能是您应用的正则表达式引擎...
  • @Wrikken,你是对的。我错误地认为微软产品的正则表达式语法会保持一致。事实证明,PowerShell(我使用的参考)具有与 Expression Web 不同的运算符。学过的知识。感谢您查看它!

标签: regex regex-greedy microsoft-expression-web


【解决方案1】:

没有一种“正则表达式”语言。虽然存在广泛的共性,但细节因实施而异。许多正则表达式使用- 作为非贪婪“0 或更多”,其他使用*?。显然是Microsoft Expression Web uses @

简而言之,正则表达式可能会有所不同,因此您通常需要对您正在使用的正则表达式进行 RTM 以查找其功能范围和详细语法(即支持更改/回溯/等、分组字符、设置速记等)

【讨论】:

  • 谢谢。这解决了它。我没有意识到,即使在 Microsoft 产品中,正则表达式语法也会发生变化。我正在使用 PowerShell 正则表达式参考,假设它适用于 Expression Web。感谢您的答复。很高兴知道未来。
【解决方案2】:

.*? 是最糟糕的,可以说正则表达式的“反模式”。它通常用作“Match-something-until-the-string-i-want”模式 - 但它不是。

尤其是在一个模式中组合多个.*? 时,可能会导致非常错误和意想不到的结果。

对于您的案例 - 如 cmets 所述 - 它有效。 (也许你做错了什么?)

但是,在生成正则表达式模式时,更具体一点总是一个好主意。 永远记住.*? 可以是任何东西。还有你真的不想匹配的东西!

在你的例子中,我会使用这样的东西:border-(?:[^:]+):\s*(?:[^\s]+)\s+(?:\#[a-fA-F0-9]{6})\s+(?:\d*(?:\.\d+)?)pt;?

它更具体,但符合给定的要求,忽略所有没有意义的空格,甚至匹配边框宽度,无论它们是否写为.234.1。如果您从单个匹配组中删除 ?:,您还可以匹配每个单个属性(如果需要)。 :位置、边框类型、颜色和粗细。

模式 border-([^:]+):\s*([^\s]+)\s+(\#[a-fA-F0-9]{6})\s+(\d*(?:\.\d+)?)pt;? 与您的字符串 border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt 将匹配:

第一场比赛:

1.top
2.solid
3.#1F497D
4..5

第二场比赛:

1.bottom
2.solid
3.#1F497D
4..5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多