2017-08-14 78 views
0

我有一個非常大的XML文件中的所有節點,每個主節點中有一個子節點查找包含標點符號

<term>text, text</term> 

一些子節點有標點符號如上圖所示,但標點符號未知。我需要獲得這些子節點中使用的所有標點符號的列表,以便我可以直觀地檢查它們,並稍後用一個標點符號替換它們。

我試過使用正則表達式/<term>[[:punct:]]<\/term>,但它在正則表達式測試中找不到匹配。

如何將所有在子節點中使用的標點符號複製到文本文件中?

如何用分號替換子節點中的所有標點符號?

下面是一個示例節點,每個節點中有兩處出現。

<conceptGrp><descripGrp><descrip type="subjectField">6821</descrip></descripGrp><languageGrp><language lang="DE" type="German" /><termGrp><term>Betonkanal BE;Betonkanal breites Ei</term><descripGrp><descrip type="termType">phraseologicalUnit</descrip></descripGrp><descripGrp><descrip type="reliabilityCode">2</descrip></descripGrp></termGrp></languageGrp><languageGrp><language lang="EN" type="English" /><termGrp><term>flattened egg-shaped concrete sewer</term><descripGrp><descrip type="termType">phraseologicalUnit</descrip></descripGrp><descripGrp><descrip type="reliabilityCode">2</descrip></descripGrp></termGrp></languageGrp></conceptGrp> 

回答

0

要回答你的第一個問題,你可以使用\p{P}匹配標點符號。因此,假設你有遍歷,你需要檢查XML節點的一些方法...

Option Infer On 
Option Strict On 

Imports System.Text.RegularExpressions 

Module Module1 

    Sub Main() 
     Dim x = <root> 
        <term>No punctuation</term> 
        <term>Here be... dots</term> 
        <term>No, there isn't a semi-colon here.</term> 
       </root> 

     Dim re As New Regex("\p{P}") 

     For Each a In x.Descendants 
      Dim puncs = re.Matches(a.Value) 
      If puncs.Count > 0 Then 
       For Each m As Match In puncs 
        'TODO: Write to a file instead of the Console. 
        Console.Write(m.Groups(0).Value) 
       Next 

       Console.WriteLine() 

      End If 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

輸出

...
,' - 。

對於問題的第二部分,你可以使用

For Each a In x.Descendants 
    Dim newValue = re.Replace(a.Value, ";") 
    'TODO: update the value of the node 
    Console.WriteLine(newValue) 
Next 

其輸出

沒有標點符號
這裏是;;;點號
否;這裏沒有;一個半;冒號;

+0

謝謝安德魯。你的正則表達式選擇所有的標點符號,如果它們後面跟着一個空格,否則它會跳過它們。我期待管道符號沒有任何空間的空間,這些也沒有拿起。我想更好的描述可能是不是空格,字母或數字的字符。我和[[:punct:]]一起玩過,但無法讓它工作。 – BenS

+0

@BenS如果你看看最後一個元素的最後一個字符,你會看到它是一個句號,它後面跟着一個空格(或任何其他字符),它被正則表達式拾取。您可以使用'[\ p {P} |]'來包含管道字符。請編輯您的問題以包含我們需要知道的所有內容,以便我們提供幫助。 –

+0

對不起,延遲迴答,但我在路上。我有一個很大的xml文件,它代表了一個雙語詞彙表,並且是來自各種來源的許多其他詞彙表的聚合。在術語節點中,可以用「特殊」字符分隔同義詞。所有這些分隔符都是未知的,但可以是逗號,分號,冒號,管道或其他字符。我首先需要找出分隔符已被使用,然後用分號替換。你的正則表達式的確如你所說的那樣工作,我剛剛在一個測試器中嘗試過,但它沒有。 – BenS