.Net正则表达式性能问题

Her*_*r33 2 .net c# regex

我有一些输出到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)

看起来引号一直匹配到第二个字符串,而不是单独考虑它们.

Ro *_* Mi 8

描述

你的正则表达式有很多回溯,我只是为另一个问题写了这样的正则表达式.请考虑以下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]*= 此块必须具有空格,后跟非空格和非等号字符
  • | 要么
  • $ 字符串的结尾,以确保我们可以捕获字符串中的最后一个键/值集
  • ) 关闭零断言块

  • 您是否介意分享用于生成图表的工具? (3认同)
  • 这是使用http://www.debuggex.com/...创建的...最重要的是它是免费的 (3认同)