我有一个这样的字符串:
$ VarCond =' EBx(_ _ _ _:_)'如果EB ='(_ _ _ _:_)',
我需要用括号替换括号中子串中的任何空格,而不是其他空格,所以最后它应该是这样的:
$ VarCond ='的EBx(_-_-_-_:_)'如果EB ='(_-_-_-_:_)',
这可以通过正则表达式替换吗?
编辑:其他例子:
$ VarCond =' EBx(Z Z Z)'如果EB ='(Z Z Z)', $ VarCond =' EBx(_ + _ L LIL L)'如果EB ='(_ + _ L LIL L)',
答案 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='(_-_-_-_:_)',