我需要一个正则表达式,它将执行以下操作 - >
例如,
保证金:7px 7px 7px 7px;
应压缩为 - >
余量:7px的;
(注意:数字可能不只是7,可以是任何数字。单位可以是px | em |%| in | cm | mm | pc | pt | ex)
答案 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
会将匹配的输入替换为第一个捕获组