RegEx用于以特殊模式添加空间

时间:2019-05-25 21:19:07

标签: php regex pcre regex-lookarounds regex-group

快速笔记:我知道降价解析器并不关心这个问题。这是为了在md文件中保持视觉一致性以及进行实验。

示例

# this
##that
###or this other

目标:阅读每一行,如果降价标头在井号/井号后没有空格,则添加一行,使其看起来像:

# this
## that
### or this other

我的非正则表达式尝试:

function inelegantFunction (string $string){
    $array = explode('#',$string);
    $num = count($array);
    $text = end($array);
    return str_repeat('#', $num-1)." ".$text;
}

echo inelegantFunction("###or this other"); 
// returns  ### or this other

这可行,但是它没有机制来匹配不太可能的七个'#'情况。

无论功效如何,我都想弄清楚如何使用php中的regex做到这一点(可能的话还可以使用javascript)。

2 个答案:

答案 0 :(得分:2)

尝试匹配(?m)^#++\K\S,以匹配以一个或多个数字符号开头的行,然后在函数中将其替换为 $0

return preg_replace('~(?m)^#++\K\S~', ' $0', $string);

请参见live demo here

要将#的数量限制为六个,请使用:

(?m)^(?!#{7})#++\K\S

答案 1 :(得分:1)

我猜测带有正确字符列表边界的简单表达式可能在这里起作用,也许是:

(#)([a-z])

如果我们可能有更多的字符,我们可以简单地将其添加到[a-z]中。

enter image description here

Demo

测试

$re = '/(#)([a-z])/m';
$str = '#this
##that
###that
### or this other';
$subst = '$1 $2';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;