我有以下函数,应删除字符串中所有出现的(...),[...]和{...}
function TCleanUp.DoStripBraces(const aInput: string): string; // works!
begin
result := TRegEx.Replace(aInput, '\([^)]*\)', '');
end;
function TCleanUp.DoStripCurlyBraces(const aInput: string): string; // does not work
begin
result := TRegEx.Replace(aInput, '\{[^\}]*}', '');
end;
function TCleanUp.DoStripSquareBrackets(const aInput: string): string; // does not work
begin
result := TRegEx.Replace(aInput, '\[[^\]]*]', '');
end;
我正在用这些字符串测试功能
'foo (bar) baz (xyz)'
'foo [bar] baz [xyz]'
'foo {bar} baz {xyz}'
所有这些都应该返回以下字符串
'foo baz '
当我在http://www.regexr.com/上使用相同的字符串和表达式时,它完全匹配出现的情况。
我也尝试过不使字符集中的括号/花括号转义,但这也不起作用。
如何使表达式起作用?
您可以这样使用一个正则表达式:
[([{].*?[)}\]]
另一方面,如果要使用3个分隔的正则表达式,可以使用:
\(.*?\)
\[.*?\]
\{.*?\}
将它们放在一起,您可以看到它们的匹配项:
上面的这些正则表达式比以下内容更具可读性:
\([^)]*?\) As you can see, this is error prone as you faced.
\[[^\]]*?\]
\{[^}]*?\}
虽然,这种可读性的缺点对性能有一点影响。使用.*?
比使用慢,[^...]*
但是除非必须解析很长的字符串,否则您不会注意到它们的区别。
您可以从视觉上看到差异:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句