2017-06-06 27 views
1

如何在正則表達式中使用「contains」(「Contains」或「%like%」)?正則表達式包含在XML元素中

我有一個正則表達式的XML節點有確切的文本匹配:

<([\w]+)[^>]*>sample<\/\1> 

它得到確切的節點的名字,但我想申請正則表達式像在C#和SQL(%LIKE%)。

文字:

<Part>this is sample part</Part> 
    <Remarks>this is sample remark</Remarks> 
    <Notes>this is sample notes</Notes> 
    <Desc>sample</Desc> 

預期的正則表達式的結果應該返回上述所有節點,但目前它只返回的最後一個節點。我建立了a sample here to test

+2

錯誤的工具。正則表達式不是一個XML解析器,*也不可能是*。 – spender

+3

爲什麼不使用XPath? ''包含(text(),「sample」)]/local-name()' –

+0

@WiktorStribiżew謝謝,我正在嘗試使用Xpath –

回答

2

您可以使用XDocument解析XML是這樣的:

var s = @"<?xml version=""1.0""?> 
    <root> 
    <Part>this is sample part</Part> 
    <Remarks>this is sample remark</Remarks> 
    <Notes>this is sample notes</Notes> 
    <Desc>sample</Desc> 
    </root>"; 
var document = XDocument.Parse(s); 
var names = document.Descendants() 
       .Elements() 
       .Where(x => x.Value.Contains("sample")) // all nodes with text having sample 
       .Select(a => a.Name.LocalName); // return the local names of the nodes 
Console.WriteLine(string.Join("\n", names)); 

它打印:

enter image description here

的XPath也可以實現:

var names2 = document.Root.XPathSelectElements("//*[contains(text(), \"sample\")]"); 
var results = names2.Select(x => x.Name.LocalName)); 

要回落的情況下,以正則表達式的XML是無效的,使用

<(?:\w+:)?(\w+)[^<]*>[^<]*?sample[^<]*</(?:\w+:)?\1> 

regex demo。請注意0​​與打開和關閉標籤節點中的任意名稱空間匹配。 [^<]匹配任何字符但是<,所以它不會溢出到下一個節點。

+0

不好的問題是具體關於正規表達式...仍然這種方法是非常合適的對於工作我必須+1它無論如何:) – grek40

+0

@wiktor只是一個簡單的問題,?性能明智這是最好的選擇? LINQ /正則表達式/ Xpath的。因爲我正在處理大量XML文件以搜索文本 –

+0

當您處理有效的XML文件時,我寧願使用帶有LINQ的XML解析器。如果您必須處理可以有效或無效的XML文件,則正則表達式可以提供幫助,速度取決於內容,XML大小和運氣。注意:我必須每天處理無效的XML,並使用XML的正則表達式 - 但它不是常規的XML,它是TMX文件格式,並且我爲它們手動構建了一個特殊的解析器。性能很好。 –

1

您正在尋找任何標籤內「sample」字符串的精確匹配,而不是包含「sample」的字符串作爲子字符串。您可以修復你的表達如下得到所有行:

<([\w]+)[^>]*>[a-zA-Z ]*sample[a-zA-Z ]*<\/\1> 
+1

我寧願使用'[^ ​​<]'而不是'[a-zA-Z]'佔位符......或者只是非貪婪的接受任何東西。這仍然是給定示例的一個修復。使用任意XML,任何正則表達式都會失敗。 – grek40

+0

一旦在'sample'前面有一個數字或標點符號,由於'[a-zA-Z] *'就不會有任何匹配。 –

+0

我同意你的看法,它當然不包括所有的情況 - 例如也可能有標點符號等 - 但它給出了問題出在哪裏以及如何涵蓋問題中提供的特定輸入。 –