Php 巩固重复模式
我正在编写一个脚本,该脚本开发某些字母数字字符字符串,由破折号Php 巩固重复模式,php,regex,Php,Regex,我正在编写一个脚本,该脚本开发某些字母数字字符字符串,由破折号-分隔。我需要测试字符串,看看是否有相同的字符集(位于破折号之间的字符)。如果是,我需要巩固它们。在我的情况下,重复的字符总是出现在前面 Examples: KRS-KRS-454-L would become: KRS-454-L DERP-DERP-545-P would become: DERP-545-P //KRS-454-L 这使用正向前瞻(?=…)来检查重复的字符串 请注意,\w还包含下划线。如果只想限制为字母
-
分隔。我需要测试字符串,看看是否有相同的字符集(位于破折号之间的字符)。如果是,我需要巩固它们。在我的情况下,重复的字符总是出现在前面
Examples:
KRS-KRS-454-L
would become:
KRS-454-L
DERP-DERP-545-P
would become:
DERP-545-P
//KRS-454-L
这使用正向前瞻(?=…)
来检查重复的字符串
请注意,\w
还包含下划线。如果只想限制为字母数字字符,请使用[a-zA-Z0-9]
此外,正如您所提到的那样,我已经锚定了^
:“重复字符总是出现在前面[…]”尝试以下模式:
/([a-z]+)(?:-\1)*(.*)/i
并将其替换为:
$1$2
演示:
$tests = array(
'KRS-KRS-454-L',
'DERP-DERP-DERP-545-P',
'OKAY-666-A'
);
foreach ($tests as $t) {
echo preg_replace('/([a-z]+)(?:-\1)*(.*)/i', '$1$2', $t) . "\n";
}
产生:
KRS-454-L
DERP-545-P
OKAY-666-A
快速解释:
([a-z]+) # group the first "word" in match group 1
(?:-\1)* # match a hyphen followed by what was matched in
# group 1, and repeat it zero or more times
(.*) # match the rest of the input and store it in group 2
替换字符串$1$2
替换为上面模式中组1和组2匹配的字符串。使用此正则表达式((?:[A-Z-])+)\1{1}
,并将匹配的字符串替换为$1
\1
与上述正则表达式中的{1}
结合使用。它将查找重复的字符实例 你需要。使用perl语法,这将适用于您:
$line =~ s/([A-Za-z0-9]+-)\1+/\1/gi;
mhyfritz(?=\1)是什么意思?我以前没有见过这种符号。@FinalForm:the
(?=)
是一种前瞻性符号,它将匹配括号中的任何内容,而不会实际使用任何文本(希望有意义)。\1
是一个反向引用,与您以前捕获的内容相匹配(在本例中,是第一组-(\w+
)。如果您想要第二个捕获组,您可以使用\2
引用它。有道理吗?谢谢你,是的。这是有道理的。为什么我不能@at your username?@mhyfritz,@FinalForm:查看此元讨论:
$line =~ s/([A-Za-z0-9]+-)\1+/\1/gi;