使用TRegEx从字符串中剥离{...}或[...]

时间:2015-04-11 23:24:03

标签: regex delphi delphi-xe3

我有以下函数,它们应该删除字符串中出现的所有(...),[...]和{...}

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/上使用相同的字符串和表达式时,它完全匹配事件。

我也试图逃避字符集中的括号/花括号,但这也不起作用。

如何使表达式有效?

2 个答案:

答案 0 :(得分:2)

你可以使用这样的一个正则表达式:

[([{].*?[)}\]]

<强> Working demo

另一方面,如果你想要3个独立的正则表达式,你可以使用:

\(.*?\)
\[.*?\]
\{.*?\}

完全放置它们,你可以看到它们匹配的内容:

Regular expression visualization

上面的这些正则表达式比以下内容更具可读性:

\([^)]*?\)     As you can see, this is error prone as you faced. 
\[[^\]]*?\]
\{[^}]*?\}

尽管如此,这种可读性的缺点对性能影响不大。使用.*?比使用[^...]*慢,但除非您必须解析非常长的字符串,否则您将不会注意到差异。

您可以直观地看到差异:

Regular expression visualization

答案 1 :(得分:1)

您忘记了最新出现的]}

尝试'\{[^\}]*\}''\[[^\]]*\]'