我有一些代码通过组合水平空白区域并将它包围在括号中来扩充正则表达式,除非它已被非反斜括号括起来。我有一段代码正在运行:
$regex_find = preg_replace('/(?<!\()[ \t]{2,}(?!\))/', '([ \t]{2,})', $regex_find);
但是,对于初学者来说,后视广告(?<!\(
)应该真正允许使用文字左括号\(
,而不是一个独立的左括号,(
由于
答案 0 :(得分:1)
您的原始正则表达式还有另一个问题。尝试运行它:
$str = "asdf( )sdf sdf";
//results in: "asdf( ( ) )sdf( )sdf"
这个正则表达式应该有效:
$regex_find = '( asdf( )sdf sdf';
preg_replace('/(?<!(\(|\s)(?=\s*\)))\s{2,}/','($0)',$regex_find);
//result = "(( )asdf( )sdf( )sdf"
修改:以下是Qtax的解决方案,其中包含额外的lookbehind以忽略转义\(
/(?<!((?<!\\)\(|\s)(?=\s*\)))\s{2,}/