0

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

border-.*\.5pt

在一个边框粗细border-top为. 它通常工作得很好,但它太贪婪了。border-bottom.5pt

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

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

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

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

border-.*?\.5pt

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

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

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

4

2 回答 2

8

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

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

于 2013-08-14T20:51:52.313 回答
3

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

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

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

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

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

它更具体,但符合给定的要求,忽略所有没有意义的空格,甚至匹配边框宽度,无论它们是否写为.2,34.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
于 2013-08-14T21:08:56.117 回答