用正则表达式替换字符串中的重复子字符串模式

时间:2015-08-19 06:03:09

标签: php regex string

我有以下字符串:

"Canal Capital(Canal Capital) Felipe Cano - Recursos Humanos - fcano@sample.com - (Canal Capital) Andres Zapata - Tecnologías de la Información - zapatacano@sample.com - 3212032851(Canal Capital) Miguel Cabo - Canal Capital - cabop@gsample.com - 457 83 00 Ext. 5227 301 734 07 56"

我希望能够删除字符串中的重复模式,因此如果模式为(Canal Capital),我应该最终得到:

"Canal Capital Felipe Cano - Recursos Humanos - fcano@sample.com - Andres Zapata - Tecnologías de la Información - zapatacano@sample.com - 3212032851 Miguel Cabo - Canal Capital - cabop@gsample.com - 457 83 00 Ext. 5227 301 734 07 56"

到目前为止,我已尝试过这种方法(如果模式只重复一次,它会起作用):

$cadena = preg_replace("/\(.*\)/", "", $cadena);

但我只得到第一个"Canal Capital"部分。我可以用正则表达式实现我的目标吗?也许有一种更好的方法来实现这一点,我不知道。感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用以下模式

/(?<=[\w-\s\S])(\(.*?\))(?=[\w\s\S])/
  • (?<=[\w-\s\S])肯定的Lookbehind - [\w-\s\S]匹配下面列表中的单个字符
  • \(字面匹配字符(
  • .*?匹配任何字符(except newline)
  • \)字面匹配字符)
  • (?=[\w\s\S])肯定前瞻 - [\w\s\S]匹配下面列表中的单个字符

所以代码看起来像

$res = preg_replace('/(?<=[\w-\s\S])(\(.*?\))(?=[\w\s\S])/', '', 'Canal Capital(Canal Capital) Felipe Cano - Recursos Humanos - fcano@sample.com - (Canal Capital) Andres Zapata - Tecnologías de la Información - zapatacano@sample.com - 3212032851(Canal Capital) Miguel Cabo - Canal Capital - cabop@gsample.com - 457 83 00 Ext. 5227 301 734 07 56');
echo $res;

或者您可以简单地将其用作

/(\(.*?\))/

Demo

Regex

答案 1 :(得分:0)

你几乎接近,你只是错过了?量词,它使得贪婪的匹配者变得非贪婪(懒惰)。

试试这样:

(\(.*?\))

结果:

  

Canal Capital Felipe Cano - Recursos Humanos - fcano@sample.com -   Andres Zapata - TecnologíasdelaInformación - zapatacano@sample.com    - 3212032851 Miguel Cabo - 运河资本 - cabop@gsample.com - 457 83 00分机5227 301 734 07 56

Demo