簡體   English   中英

用於在XML元素之間獲取文本的正則表達式

[英]Regular expression for getting text between XML elements

我正在看這個正則表達式

<(\\w*)>\\.*</(\\w*)>

通過教程等我理解為閱讀,匹配表格后面的任何內容

<tag1>blah</tag1>

即XML元素,一些文本和結束XML元素。 但是,當我在各種正則表達式檢查器上運行時,例如Expresso,它與我認為不應該匹配。

注意:進一步復雜化這個正則表達式是在Java中,據我所知,這意味着存在一些細微差別。

我錯過了什么?

任何贊賞的東西......

謝謝

采用:

<(\w*)>.*</(\w*)>

\\\\w - literal \\ ,然后w
\\\\ - 文字\\

只有文字需要轉義,但有些語言使用\\來轉義字符串本身的字符,強制你在字符串中使用\\\\表示在regex中的\\ 在這些語言中,嘗試拉出\\\\ (正則表達式中的文字\\ )可以是\\\\\\\\ 我認為這可能是在示例代碼中看到\\\\時出現混淆的原因。

改善正則表達式:

如果有人想成為一個沖洗器並構造一個不規則的表達式,如:

< _some_tag some="stuff" >
    some <strong>content</strong>
< / _some_tag >

您可以使用這個更通用的正則表達式來捕獲標記名稱,內容和屬性。

<\s*([A-Za-z_]\w*)\s*([^\>]+)>(.*?)<\s*\/\s\1\s*>

請注意.*? 如果頁面中存在相同的標記,則是必需的,否則保持貪婪將使其捕獲所有內容,直到具有該名稱的最后一個標記關閉。 另外<tag1>blah</tag2>顯然是假的,但是如果你想要靈活,你可以改變這個正則表達式的最后一部分。

你的基本問題是你的正則表達式是“貪婪的”,這意味着它將匹配從第一個標簽到最后一個標簽, 包括嵌套標簽。 為了使它不貪婪,請使用非貪婪的語法.*? (而不是.* )。

另一個問題是你需要匹配你的標簽 - 使用“后退參考”: \\1表示“第一個被捕獲的組”。

這個正則表達式應該這樣做:

<(\w+)>.*?</\1>

它使用匹配打開/關閉標記之間的非貪婪捕獲。

雖然您使用的是java,但是我將反斜杠轉義為\\\\以使regxes可讀。

與使用正則表達式訪問XML的所有其他嘗試一樣,您的嘗試是錯誤的。 錯誤的方法有兩種:它不會匹配編寫這段XML的每種合法方式(你檢查過標簽中允許空格的位置嗎?),它會匹配一些它不應該的東西(例如看起來像XML的東西)但是在評論或CDATA部分內)。

現在有些情況下錯誤的代碼是可以接受的,例如,如果你是屏幕抓取並且對80%的成功率感到滿意。 但如果是這種情況,您需要將其聲明為解決方案的明確要求。

您永遠不會獲得100%成功率的原因是XML不是常規語言。 這是一個技術術語。 一些基本的計算機科學理論告訴您,正則表達式只能用於處理常規語言。

您可能會發現無論如何使用XML解析器更快。 我曾經有一個執行30次太慢的系統並通過用正確的解析替換正則表達式代碼來解決問題。

這會奏效

<[^>]*>[^<]*<[^>]*>

匹配沒有傾斜的支架。 但這兩個例子都匹配

<tag1>blah</tag2>

但是你想要XML的匹配標簽嗎?

<tag1>blah</tag1>

在這種情況下,您需要一個帶后向引用的解決方案。 有關詳細信息,請參閱此問題

此示例使用反向引用

<([^>]*)>[^<]*</\1>

所以會匹配

<tag1>blah</tag1>

但不是

<tag1>blah</tag2>

我知道這不是你問的,但我認為你想要XML標簽匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM