使用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个单独的