巩固重复模式

时间:2011-07-18 14:02:47

标签: php regex

我正在开发一个脚本,用于开发某些字母数字字符串,用短划线-分隔。我需要测试字符串以查看是否有任何字符集(字符串之间的字符)是相同的。如果是,我需要巩固它们。在我的情况下,重复的字符总是出现在前面。

Examples:

KRS-KRS-454-L
would become:
KRS-454-L

DERP-DERP-545-P
would become:
DERP-545-P

4 个答案:

答案 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;