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

使用TRegEx从字符串中剥离{…}或[…],regex,delphi,delphi-xe3,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 no

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

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 '
当我在上面使用相同的字符串和表达式时,它与引用完全匹配

我还试图不转义字符集中的括号/大括号,但这也不起作用


如何使表达式工作?

您忘了避开最近出现的
]
}


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

您忘记转义最近出现的
]
}


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

您忘记转义最近出现的
]
}


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

您忘记转义最近出现的
]
}


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

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

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

另一方面,如果希望有3个单独的正则表达式,可以使用:

\(.*?\)
\[.*?\]
\{.*?\}
将它们放在一起,您可以看到它们匹配的内容:

以上这些正则表达式的可读性比以下正则表达式更高:

\([^)]*?\)     As you can see, this is error prone as you faced. 
\[[^\]]*?\]
\{[^}]*?\}
尽管如此,这种可读性的缺点对性能影响不大。使用
*?
比使用
[^…]*
慢,但是除非您必须解析非常长的字符串,否则您不会注意到差异

您可以直观地看到差异:


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

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

另一方面,如果希望有3个单独的正则表达式,可以使用:

\(.*?\)
\[.*?\]
\{.*?\}
将它们放在一起,您可以看到它们匹配的内容:

以上这些正则表达式的可读性比以下正则表达式更高:

\([^)]*?\)     As you can see, this is error prone as you faced. 
\[[^\]]*?\]
\{[^}]*?\}
尽管如此,这种可读性的缺点对性能影响不大。使用
*?
比使用
[^…]*
慢,但是除非您必须解析非常长的字符串,否则您不会注意到差异

您可以直观地看到差异:


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

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

另一方面,如果希望有3个单独的正则表达式,可以使用:

\(.*?\)
\[.*?\]
\{.*?\}
将它们放在一起,您可以看到它们匹配的内容:

以上这些正则表达式的可读性比以下正则表达式更高:

\([^)]*?\)     As you can see, this is error prone as you faced. 
\[[^\]]*?\]
\{[^}]*?\}
尽管如此,这种可读性的缺点对性能影响不大。使用
*?
比使用
[^…]*
慢,但是除非您必须解析非常长的字符串,否则您不会注意到差异

您可以直观地看到差异:


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

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

另一方面,如果希望有3个单独的正则表达式,可以使用:

\(.*?\)
\[.*?\]
\{.*?\}
将它们放在一起,您可以看到它们匹配的内容:

以上这些正则表达式的可读性比以下正则表达式更高:

\([^)]*?\)     As you can see, this is error prone as you faced. 
\[[^\]]*?\]
\{[^}]*?\}
尽管如此,这种可读性的缺点对性能影响不大。使用
*?
比使用
[^…]*
慢,但是除非您必须解析非常长的字符串,否则您不会注意到差异

您可以直观地看到差异:



你有嵌套吗?我在写一个通用文本处理器,所以我不知道输入。是什么让你相信正则表达式可以完全通用?没有什么特别的,但我认为它比我在有限时间内想出的任何算法都好。你有嵌套吗?我在写一个通用文本处理器,所以我真的不知道输入。是什么让你相信正则表达式可以完全通用没有什么特别的,但我认为它比我在有限的时间内想出的任何算法都好。你有嵌套吗?我在写一个通用文本处理器,所以我真的不知道输入。是什么让你相信正则表达式可以完全通用没有什么特别的,但我认为它比我在有限的时间内想出的任何算法都好。你有嵌套吗?我在写一个通用文本处理器,所以我真的不知道输入。是什么让你相信正则表达式可以完全通用?没有什么特别的,但我认为它比我在有限时间内想出的任何算法都好。闭口]和}不需要转义,因为它们只有在有开口时才被视为特殊字符[或{(但逃逸也无妨)哦,好吧,我不知道。我只是根据其他正则表达式类型的经验给出了一个答案。结束]和}不需要逃逸,因为它们只有在有开口时才被视为特殊字符[或{(但逃逸也无妨)哦,好吧,我不知道。我只是根据其他正则表达式类型的经验给出了一个答案。结束]和}不需要转义,因为它们只有在有一个开口时才被认为是特殊字符[或{(但转义它们也没什么害处)哦,好吧,我不知道。我只是根据其他正则表达式类型的经验给出了一个答案。结束]和}不需要转义,因为它们只有在有一个开口时才被认为是特殊字符[或{(但转义它们也没什么害处)哦,好吧,我不知道。我只是根据其他正则表达式类型的经验给出了一个答案。很好,我将使用3个分开的表达式。我不知道你可以组合量词来实现这一点。@Gloegg只是想让你知道,使用这些量词可以使正则表达式从贪婪变为懒惰。例如,如果你有
a*b
l在字符串
aaabab
中贪婪地匹配
aaabab
,但是如果你有
a*?b
它将惰性地匹配
aaab
。很好,我将使用3个单独的