我有一些输出到RichTextBox(可能很多或很少,它的搜索结果),并希望应用一些自定义颜色编码.决定使用正则表达式,当它工作时,它似乎相当缓慢(约20秒)300结果.
输出始终采用相同的格式:
Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4=
Run Code Online (Sandbox Code Playgroud)
等等.所以,我有4个案例:stuff = stuff,stuff =(stuff)stuff ="string of stuff"和stuff =
以下正则表达式工作正常(匹配它应该的一切),但速度很慢:
(\S+)=("(?:[^"]|(?<open>")|(?<-open>"))+(?(open)(?!))")|(\S+)=(\((?:[^()]|(?<open>\()|(?<-open>\)))+(?(open)(?!))\))|(\S+)=(\S+)|(\S+)=\s
Run Code Online (Sandbox Code Playgroud)
你们看到什么特别的东西会减慢它的速度吗?我相信你可以说,第一部分与引号相匹配,第二部分与括号相匹配,等等.
更新 只是开玩笑,并不能完全归还我想要的......这个:
Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4= Attribute5="Another string"
Run Code Online (Sandbox Code Playgroud)
返回:
5: Attribute1
6: Value1
3: Attribute2
4: (Value2)
1: Attribute3
2: "String value 3" Attribute4= Attribute5="Another string"
Run Code Online (Sandbox Code Playgroud)
看起来引号一直匹配到第二个字符串,而不是单独考虑它们.
你的正则表达式有很多回溯,我只是为另一个问题写了这样的正则表达式.请考虑以下powershell示例的通用正则表达式.
(?:\s|^)([^=]*)(?:=?["(]?([^)"]*?)[")]?)?(?=\s[^=\s]*=|$)
$Matches = @()
$String = 'Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4= Attribute8=Value8 Attribut5=(Value5) Attribute6="String value 6" Attribute7='
$Regex = '(?:\s|^)([^=]*)(?:=?["(]?([^)"]*?)[")]?)?(?=\s[^=\s]*=|$)'
Write-Host start with
write-host $String
Write-Host
Write-Host found
([regex]"(?i)$Regex").matches($String) | foreach {
write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'`t= value at $($_.Groups[2].Index) = '$($_.Groups[2].Value)'"
} # next match
Run Code Online (Sandbox Code Playgroud)
start with
Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4= Attribute8=Value8 Attribut5=(Value5) Attribute6="String value 6" Attribute7=
found
key at 0 = 'Attribute1' = value at 11 = 'Value1'
key at 18 = 'Attribute2' = value at 30 = 'Value2'
key at 38 = 'Attribute3' = value at 50 = 'String value 3'
key at 66 = 'Attribute4' = value at 77 = ''
key at 78 = 'Attribute8' = value at 89 = 'Value8'
key at 96 = 'Attribut5' = value at 107 = 'Value5'
key at 115 = 'Attribute6' = value at 127 = 'String value 6'
key at 143 = 'Attribute7' = value at 154 = ''
Run Code Online (Sandbox Code Playgroud)

(?:\s|^) 非捕获以确保我们处于字符串或子字符串的开头([^=]*) 捕获所有非等号字符直到第一个等号(?: 启动非捕获块=? 消耗等号(如果存在)["(]? 消耗报价或打开圆括号(如果存在)([^)"]*?) 捕获所有非近圆括号和非引号字符,直到[")]? 消耗报价或关闭圆括号(如果存在))? 关闭非捕获块,并且不需要此部分(?= 启动零断言块以确保我们不会进入下一个键/值集\s[^=\s]*= 此块必须具有空格,后跟非空格和非等号字符| 要么$ 字符串的结尾,以确保我们可以捕获字符串中的最后一个键/值集) 关闭零断言块