带括号的正则表达式 - 性能

时间:2013-12-31 20:11:54

标签: c# regex match

今天我必须在多个字符串(下面的一个)中的括号之间找到值

[xyz]=[something][xsd]=[123;#blabla][abc]=[2013-12-31 10:00]

我唯一知道的是名字前面的名字:xyz,xsd和abc

我目前正在使用的正则表达式是:\[(xsd)(?:\]=\[)([^\)]+?)\]它给了我两个组(名称 - xsd和值 - 123; #blabla)。

Hovewer我正在考虑另一个正则表达式:(?<=\[xsd\]=\[)(.*?)(?=\])只给出一个值为

的组

有人能告诉我哪一个更好/更快吗?或者可能有一个更简单的表达式来获得一个值? :)

1 个答案:

答案 0 :(得分:1)

我认为其中一个表达式更好,因为不使用延迟量词,并且您不需要提取值,因为它是完整的结果:

(?<=\[xsd]=\[)[^]]+(?=])


(?<=\[(?>xyz|xsd|abc)]=\[)[^]]+(?=])

第一个模式细节:

(?<=             # lookbehind assertion (means: preceded by)
    \[xsd]=\[    # literal: [xsd]=[  ,note that ] doesn't need to be escaped
)                # close the lookbehind
[^]]+            # all charaters except ], one or more times
(?=])            # lookahead assertion: (followed by ] )

使用具有减少的字符类的贪婪量词总是比使用具有延迟量词的点更快,因为在第二种情况下,正则表达式引擎必须检查惰性量词所吃的每个字符,如果是懒惰量词之后的子模式火柴。使用贪婪的量词,正则表达式引擎会尽可能地吃掉所有可能的东西。