2011-06-15 65 views
1

我必須將一些硬編碼的字符串移動到外部資源文件,並且我正在嘗試使用正則表達式自動執行一些步驟。在Visual Studio中替換爲使用正則表達式:意外的結果

儘管如此,我仍然有一些困難需要解決。

示例代碼摘錄:

public List<string> GetAllProductIDs() 
    { 
     var doc = XElement.Load(Path + @"\light.xml"); 
     var elements = doc.Element("products").Elements("product"); 
     // (...) 

,我使用正則表達式:

  • 查找= 「{([^」 \ r] *)}」

(查找以雙撇號開頭和結尾的字符串,並且不包含另一個雙apo在中間也不會有斷線,並捕捉它沒有第一和最後一個雙撇號)

  • 與=資源替換。\ 1

我的本意在於

  • 元素( 「產品」)

會變成

  • 元(Resources.products)

會發生什麼事是

預期的結果:在正則表達式確實匹配VAR DOC = XElement.Load(路徑+ @「\ light.xml」 );

意外結果:正則表達式匹配* var elements = doc.Element(「products 」).Elements(「 product」); (這是我可以應付,我只是手動跳過)

,但它不匹配「產品」也不「產品」

爲什麼?

回答

1

內置的Visual Studio正則表達式不同於更常見的正則表達式風格。

問題是\r被字面解釋而不是返回控制字符。只有少數控制字符appear to be supported by the Visual Studio regex flavor\r不是其中之一。因此,引擎正在使用它。

要驗證這一點,請將\r更改爲\a,您會發現它與「產品」和「產品」相匹配。原因在於這些單詞中不存在文字字符「a」,所以匹配成功,而\r使匹配失敗,因爲字母「r」確實存在於這些單詞中。

要解決此問題,可以參考返回控制字符的Unicode十六進制值,即000D。更改\r\u000D\x0D

"{([^"\u000D]*)}" 

"{([^"\x0D]*)}" 

您可能感興趣的檢查出Visual Studio Productivity Power Tools,它支持大多數人都習慣到.NET正則表達式的味道。使用該工具,您可以使用:

  • 樣式:"([^"\r]*)"請注意\r按照預期在這種情況下工作。
  • 更換:Resources.$1
+0

內容翔實且樂於助人,謝謝。另外,您推薦的那個生產力套件看起來非常有前途 – 2011-06-15 23:26:34

0

我試圖取代XML:

替換:

<metaKeyword2>Avaeon.Topoix.Gravity.Add</metaKeyword2> 

與此

<metaKeywords> 
     <metaKeyword> 
     <keyword>Avaeon.Topoix.Gravity.Add</keyword> 
     </metaKeyword> 
    </metaKeywords> 

屬性中的值是可變的,我似乎無法得到它,我懷疑XML的<>打破它,這是我已經試過

<metaKeyword2>:w</metaKeyword2> 

<metaKeywords> 
     <metaKeyword> 
     <keyword>\1</keyword> 
     </metaKeyword> 
    </metaKeywords> 

,但覺得沒有什麼。

相關問題