用减号替换空格,但仅在括号内

时间:2014-07-14 08:41:37

标签: regex delphi

我有一个这样的字符串:

  

$ VarCond =' EBx(_ _ _ _:_)'如果EB ='(_ _ _ _:_)',

我需要用括号替换括号中子串中的任何空格,而不是其他空格,所以最后它应该是这样的:

  

$ VarCond ='的EBx(_-_-_-_:_)'如果EB ='(_-_-_-_:_)',

这可以通过正则表达式替换吗?

编辑:其他例子:

  

$ VarCond =' EBx(Z Z Z)'如果EB ='(Z Z Z)',   $ VarCond =' EBx(_ + _ L LIL L)'如果EB ='(_ + _ L LIL L)',

2 个答案:

答案 0 :(得分:4)

搜索:[ ](?=[^(]*\))(开头的括号是可选的,但可以更容易地查看空格。)

替换:-

这假设您的括号是平衡的,如您的示例所示,(not (nested))

the demo中,请参阅底部的替换。

<强>解释

  • [ ]匹配空格字符(括号是可选的)
  • 前瞻(?=[^(]*\))声称接下来的是任何数量的不是开头标准的字符,后面是结束标准。这确保我们在文件中。

在Delphi中

var
    ResultString: string;

ResultString := '';
try
    ResultString := TRegEx.Replace(SubjectString, ' (?=[^(]*\))', '-', [roMultiLine]);
except
    on E: ERegularExpressionError do begin
        // Syntax error in the regular expression
    end;
end;

<强>参考

答案 1 :(得分:0)

是的,这是可能的。

Pattern: (?<=\()(.) (.) (.) (.:.)(?=\))
Replace: \1-\2-\3-\4

或者,更简单的方法是直接使用parens而不是lookahead和lookbehind:

Pattern: \((.) (.) (.) (.:.)\)
Replace: (\1-\2-\3-\4)

请注意,如果您的语言需要,您可能需要在替换时使用$1-$2...而不是\1-\2...

这是PHP的一个例子:

$s="\$VarCond='EBx(_ _ _ _:_)' if EB='(_ _ _ _:_)',";

echo preg_replace('/(?<=\()(.) (.) (.) (.:.)(?=\))/', '\1-\2-\3-\4', $s);

// $VarCond='EBx(_-_-_-_:_)' if EB='(_-_-_-_:_)',