查找并替换两个可变长度整数之间的连字符( - )

时间:2013-01-16 11:14:29

标签: php regex text preg-replace

我有大量的文本,在该文本中有几次出现的文本,如201014120 - 10。还有带正常连字符( - )的文本。

我正在尝试做的是用逗号,替换两个数字之间的连字符,但替换文本中的任何其他连字符。我想用PHP的preg_replace来做这件事。

数字不相同,每个数字的长度对于所有文本都不相同。

我尝试了不同类型的正则表达式,包括代码和非常好的website

4 个答案:

答案 0 :(得分:1)

尝试:

$str='e-mail 201014120 - 10 e - mail 201014120-10';    
echo preg_replace('/(\d+\s*)-(\s*\d+)/','${1},${2}',$str);

>>> e-mail 201014120 , 10 e - mail 201014120,10

匹配(\d+\s*)-(\d+\s*)

\d+ # One or more digits 
\s* # Zero or more white space characters
-   # Literal hypen
()  # Capture group 

替换${1},${2}

${1} # The first captured group
,    # A literal comma
${2} # The second captured group

答案 1 :(得分:1)

您可以使用lookaround确保只匹配数字包围的连字符:

preg_replace('/(?<=\d)\s*-\s*(?=\d)/', ', ', $input);

(?<=\d)是正面的后视:它只允许正则表达式匹配,如果它前面有一个数字。相反,(?=\d)是积极向前看的。正则表达式将匹配(并因此替换)连字符周围的任何空格。

答案 2 :(得分:0)

未测试:

preg_replace("/(\d+)-(\d+)/g","$1,$2",$text);

或者,如果您的文字是“数字”,“空格”,“连字符”,“空格”,“数字”

preg_replace("/(\d+\w*)-(\w*\d+)/g","$1,$2",$text);

答案 3 :(得分:0)

<?php
$string = '201014120 - 10';
$pattern = '/(\d+) - (\d+)/';
$replacement = '$1,$2';
echo preg_replace($pattern, $replacement, $string);
?>