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;