2013-08-06 25 views
-1

我不知道我在做什麼錯。我有這個字符串,我想更換到最後一個標記(已經在一個字符串中)RegEx

<?xml version="1.0" encoding="utf-8" ?> 
<Sections> 
    <Section> 

我使用正則表達式來代替一切,包括<Section>,並留下其餘不變。

arrayValues[index].replace("/[([.,\n,\s])*<Section>]/", "---"); 

我的正則表達式有什麼問題?這是否意味着要包括---(包括<Section>)在內的所有字符,包括新行和空格?

+6

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Kristian

+0

託尼?託尼?託尼? –

+1

@kristian http://meta.stackexchange.com/questions/182189/please-stop-linking-to-the-zalgo-anti-cthulhu-regex-rant,除此之外,正則表達式可以解析HTML就好了,儘管普遍的看法。 – sgroves

回答

2

首先,你需要刪除你的正則表達式的引號 - 如果他們在那裏,參數將不會作爲正則表達式處理。 JavaScript會將它看作一個字符串(因爲它是一個字符串)並嘗試從字面上匹配它。

現在,該是採取的,我們可以簡化您的正則表達式有點護理:

arrayValues[index].replace(/[\s\S]*?<Section>/, "---"); 

[\s\S]得到周圍JavaScript的缺乏s標誌(由大多數語言支持的一個方便的選項,使.到匹配換行符)。 \s確實匹配換行符(即使沒有指定一個s標誌),所以字符類[\s\S]告訴正則表達式引擎匹配:

  • \s - 空白字符,這可能是一個換行符

OR

  • \S - 一個 -whitespace字符

所以,你能想到的[\s\S]作爲匹配.(除換行符之外的任何字符)或文字\n(換行)。有關更多信息,請參閱Javascript regex multiline flag doesn't work


?用來進行初始[\s\S]*比賽非貪婪的,所以一旦它擊中的<Section>首次出現的,正則表達式引擎將停止。

+0

我會讓班級不貪婪,以防萬一。 – georg

+0

好點@ thg435,謝謝 – sgroves

+0

閱讀答案貼在鏈接上,試圖圍繞我的頭[\ s \ S]。這是如何匹配一條新線?也許我應該把它作爲一個不同的問題發佈。 –

0
arrayValues[index].replace("/[([.,\n,\s])*<Section>]/", "---"); 

什麼是錯的我正則表達式?

它不是正則表達式,它是字符串文字。一個字符串會被轉換成一個正則表達式,但是你的字符串會包含斜槓。改爲使用regex literal

arrayValues[index].replace(/[\S\s]*<Section>/, "---"); 

此外,您有太多不必要的字符。整個事情圍繞着[]建立一個角色類,這不是你想要的。捕獲組()只是包裝一個可以重複的字符類。字符類中的點.確實與字面點相匹配,而不是所有字符。

相關問題