我正在开发一个脚本,用于开发某些字母数字字符串,用短划线-
分隔。我需要测试字符串以查看是否有任何字符集(字符串之间的字符)是相同的。如果是,我需要巩固它们。在我的情况下,重复的字符总是出现在前面。
Examples:
KRS-KRS-454-L
would become:
KRS-454-L
DERP-DERP-545-P
would become:
DERP-545-P
答案 0 :(得分:10)
<?php
$s = 'KRS-KRS-454-L';
echo preg_replace('/^(\w+)-(?=\1)/', '', $s);
?>
// KRS-454-L
这使用正向前瞻 (?=...)
来检查重复的字符串。
请注意\w
也包含下划线。如果您只想限制为字母数字字符,请使用[a-zA-Z0-9]
。
另外,正如你所提到的那样,我已经使用了^
:“重复的字符总是出现在前面[...]
答案 1 :(得分:3)
尝试模式:
/([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组匹配的内容。
答案 2 :(得分:0)
使用此正则表达式((?:[A-Z-])+)\1{1}
并将匹配的字符串替换为$ 1。
\1
与上述正则表达式中的{1}
一起使用。它将寻找重复的字符实例。
答案 3 :(得分:0)
您需要back references。使用perl语法,这对你有用:
$line =~ s/([A-Za-z0-9]+-)\1+/\1/gi;