2013-05-13 73 views
2

我有一些輸出到RichTextBox(可能很多或小塊,其搜索結果),並且想要應用一些自定義顏色編碼。決定用正則表達式來處理它,並且它可以工作,但對於300個結果來說,它似乎很慢(約20秒)。.Net正則表達式問題

輸出始終在相同的格式:

Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4= 

等。所以,我有4個情況:東西=東西,東西=(東西)的東西=和東西「的東西串」 =

下面的正則表達式工作得很好(匹配它應該一切),但速度很慢:

(\S+)=("(?:[^"]|(?<open>")|(?<-open>"))+(?(open)(?!))")|(\S+)=(\((?:[^()]|(?<open>\()|(?<-open>\)))+(?(open)(?!))\))|(\S+)=(\S+)|(\S+)=\s 

你們看到有什麼特別的東西會減慢速度嗎?正如我可以肯定的那樣,第一部分與引號匹配,第二部分與括號等相匹配。

UPDATE 開玩笑的,不正是我想要的回報......這:

Attribute1=Value1 Attribute2=(Value2) Attribute3="String value 3" Attribute4= Attribute5="Another string" 

返回此:

5: Attribute1 
6: Value1 
3: Attribute2 
4: (Value2) 
1: Attribute3 
2: "String value 3" Attribute4= Attribute5="Another string" 

貌似報價一路之隔匹配到第二個字符串,而不是單獨考慮它們。

+0

爲'ATTR =(VAL)'的情況下,可以'val'包含括號本身? – 2013-05-13 19:28:44

+0

@CasimiretHippolyte是的,你可以有像attr1 = value(0.0) – Hershizer33 2013-05-13 19:58:50

回答

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 

息率
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 = '' 

摘要

enter image description here

  • (?:\s|^)非捕獲,以確保我們在串或串開始
  • ([^=]*)捕獲所有非equalsign字符高達第一個等號
  • (?:開始非捕獲塊,
  • =?消費如果存在的話,如果他們存在
  • ([^)"]*?)捕獲
  • ["(]?消耗的報價或開圓括號等號所有非接近圓括弧和非引號字符,直到
  • [")]?消耗的報價或接近圓形支架,如果他們存在
  • )?關閉非捕獲塊,使不需要
  • (?=這部分開始零斷言塊,以確保我們不會游到下一個關鍵/值設置
  • \s[^=\s]*=該塊必須遵循非空間和非equalsigns字符
  • |或字符串的
  • $端無論是空間,以確保我們能夠捕捉到最後一個鍵/值設置substing在字符串中
  • )關閉零斷言塊
+3

你介意分享你用來生成圖表的工具嗎? – Basic 2013-05-13 19:46:15

+0

太棒了......謝謝!很棒。我也迴應@ Basic的問題,該圖從哪裏來? – Hershizer33 2013-05-13 19:49:43

+1

看起來像http://www.regexper.com/做一些類似的東西,這是我腰帶上的一個新工具 – Basic 2013-05-13 19:51:26

2

你可以試試這個模式:

(?<attr>(?>\w+))=(?<val>(?>"(?>[^"]*)"|\((?>[^)]+)\)|(?>\S+)|(?=(?>\s\w+=|$)))) 
+0

只是想讓你知道這也適用!謝謝! – Hershizer33 2013-05-13 19:52:08