所以我想使用下面的正则表达式搜索字符串:
border-.*\.5pt
在边框粗细为border-top
的文件中查找所有border-bottom
,.5pt
等CSS属性。它通常效果很好,但太贪心了。
例如,以下所有内容都以单一匹配形式返回:
border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt
我希望这两个CSS属性是两个单独的匹配。
所以我试着将我的正则表达式修改为:
border-.*?\.5pt
使用?
使其变得非贪婪。但是,在修改之后,没有任何内容匹配。
任何人都能解释为什么我会看到这种行为吗?我错过了什么?
(如果值得了解,我在进行此搜索时使用的是Microsoft Expression Web的“使用正则表达式查找”。)
答案 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;?
它更具体,但匹配给定的要求,忽略所有不会产生的空格,甚至匹配边框宽度,如果它们被写为.2
,3
或{{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