关于*的困惑?正则表达式运算符

时间:2013-08-14 20:47:47

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

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

border-.*\.5pt

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

例如,以下所有内容都以单一匹配形式返回:

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

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

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

border-.*?\.5pt

使用?使其变得非贪婪。但是,在修改之后,没有任何内容匹配。

任何人都能解释为什么我会看到这种行为吗?我错过了什么?

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

.*?是最苛刻的,所以说正则表达式的“反模式”。它通常用作“Match-something-until-the-string-i-want”模式 - 但事实并非如此。

特别是在一个模式中组合多个.*?时,可能会导致非常错误和意外的结果。

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

然而,在生成正则表达式模式时,更加具体是一个好主意。 始终保持.*?可能是任何事情。还有东西,你真的不想匹配!

在您的示例中,我会使用以下内容:border-(?:[^:]+):\s*(?:[^\s]+)\s+(?:\#[a-fA-F0-9]{6})\s+(?:\d*(?:\.\d+)?)pt;?

它更具体,但匹配给定的要求,忽略所有不会产生的空格,甚至匹配边框宽度,如果它们被写为.23或{{1} }。如果从单个匹配组中删除4.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