使用 TRegEx 从字符串中去除 {...} 或 [...]
Strip {...} or [...] from string using TRegEx
我有以下函数,它们应该删除字符串中所有出现的 (...)、[...] 和 {...}
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}'
哪些都应该return下面的字符串
'foo baz '
当我在 http://www.regexr.com/ 上使用相同的字符串和表达式时,它完全匹配出现的情况。
我也试过不转义字符集中的括号/花括号,但也没用。
如何使表达式起作用?
您忘记转义最近出现的 ]
和 }
。
试试 '\{[^\}]*\}'
和 '\[[^\]]*\]'
。
您可以像这样使用一个正则表达式:
[([{].*?[)}\]]
另一方面,如果你想有 3 个独立的正则表达式,你可以使用:
\(.*?\)
\[.*?\]
\{.*?\}
把它们放在一起,你可以看到它们匹配的是什么:
上面的这些正则表达式比下面的更易读:
\([^)]*?\) As you can see, this is error prone as you faced.
\[[^\]]*?\]
\{[^}]*?\}
虽然,这种可读性的缺点对性能影响不大。使用 .*?
比使用 [^...]*
慢,但除非您必须解析非常长的字符串,否则您不会注意到差异。
肉眼就能看出区别:
我有以下函数,它们应该删除字符串中所有出现的 (...)、[...] 和 {...}
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}'
哪些都应该return下面的字符串
'foo baz '
当我在 http://www.regexr.com/ 上使用相同的字符串和表达式时,它完全匹配出现的情况。
我也试过不转义字符集中的括号/花括号,但也没用。
如何使表达式起作用?
您忘记转义最近出现的 ]
和 }
。
试试 '\{[^\}]*\}'
和 '\[[^\]]*\]'
。
您可以像这样使用一个正则表达式:
[([{].*?[)}\]]
另一方面,如果你想有 3 个独立的正则表达式,你可以使用:
\(.*?\)
\[.*?\]
\{.*?\}
把它们放在一起,你可以看到它们匹配的是什么:
上面的这些正则表达式比下面的更易读:
\([^)]*?\) As you can see, this is error prone as you faced.
\[[^\]]*?\]
\{[^}]*?\}
虽然,这种可读性的缺点对性能影响不大。使用 .*?
比使用 [^...]*
慢,但除非您必须解析非常长的字符串,否则您不会注意到差异。
肉眼就能看出区别: