正则表达式匹配源数据,如7px 7px 7px 7px?

时间:2013-02-05 11:56:15

标签: regex regular-language

我需要一个正则表达式,它将执行以下操作 - >

例如,

保证金:7px 7px 7px 7px;

应压缩为 - >

余量:7px的;

(注意:数字可能不只是7,可以是任何数字。单位可以是px | em |%| in | cm | mm | pc | pt | ex)

3 个答案:

答案 0 :(得分:2)

在重复4次的特定情况下,这绝对是可能的。

使用反向引用,对于特定值n,可以重复该次数。在您的情况下,n = 4

这个匹配任何仅由字母字符组成的“单位”值,即“px”,“em”或“foo”,加上特殊情况“%”。通过将\w*替换为更具体的匹配项(例如(?:em|px|......)

,可以对特定单位进行更严格的限制
/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/

例如:

// first four examples all match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7px 7px 7px 7px');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7em 7em 7em 7em');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5px 5px 5px 5px');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7% 7% 7% 7%');
1

echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5.2cm 5.2cm 5.2cm 5.2cm');
1

// different value, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '5px 5px 5px 7px');
0

// not 4 elements, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7px 7px 7px');
0

// different unit, no match
echo preg_match('/^(\d+(?:\.\d+)?(?:\w*|%))\s+\1\s+\1\s+\1$/', '7em 7em 7em 7px');
0

答案 1 :(得分:1)

可能你不是要求特殊情况7,但对于任何数字,所有四个都是相同的。 One can prove,没有这样的正则表达式。

答案 2 :(得分:1)

(\d+(px|em|%|in|cm|mm|pc|pt|ex))\s+\1\s+\1\s+\1替换为$1

\d+匹配一个或多个数字 (px|em|%|in|cm|mm|pc|pt|ex)匹配任何一个提到的单位 \s+匹配一个或多个空格(用于匹配每次出现之间的分隔) \1匹配第一个捕获组,即后跟单位的数字(4次\ 1需要4次出现的数字+单位)

如果还允许小数部分,请使用(\d+(.\d+)?(px|em|%|in|cm|mm|pc|pt|ex))\s+\1\s+\1\s+\1

替换$1会将匹配的输入替换为第一个捕获组