2011-02-03 70 views
0

在正則表達式中遇到了一些麻煩。加載到actionscript的我的XML文件刪除所有空格(自動修剪文本)。所以我想用一個詞來替換所有的SPACE,以便我可以在我自己的解析中修復它。正則表達式替換(as3) - 使用文本查找但不能替換

下面是我想要調整的標籤的示例。

<w:t> </w:t> 
<w:t> Test</w:t> 
<w:t>Test </w:t> 

這是我想要的結果。

<w:t>%SPACE%</w:t> 
<w:t>%SPACE%Test</w:t> 
<w:t>Test%SPACE%</w:t> 

我得到的最接近的結果是<w:t>\s|\s</w:t>

最大的問題是,它改變了一切腐化的XML文件中的所有空間。只會在w:t節點內改變,但不會破壞文本。

+0

'測試測試`?是否應該更換所有三個空間? – 2011-02-03 16:18:41

回答

0

提出了一個不太好的解決方法。但是,問題是,當你對時鐘工作。

我運行替換3次代替。

 
var reg1 : RegExp = /<w:t>\s/gm; 
data = data.replace(reg1, "<w:t>%DEADSPACE%"); 

var reg2 :RegExp = /\s<\/w:t>/gm; 
data = data.replace(reg2, "%DEADSPACE%</w:t>"); 

var reg3 :RegExp = /<w:t>\s<\/w:t>/gm; 
data = data.replace(reg3, "<w:t>%DEADSPACE%</w:t>"); 

RegExp,它有什麼好處。是絕對沒有(唱);)

+0

如果正確使用它,正則表達式有很多好處。這只是需要練習。 (我並不是想讓自己居高臨下,只是說出一個事實,花了我幾個月的時間去真正地對待他們!) – 2011-02-03 17:13:07

1
var reg1 : RegExp = /((?:<w:t>|\G)[^<\s]*+)\s/g; 
data = data.replace(reg1, "$1%SPACE%"); 

(?:<w:t>|\G)意味着每場比賽之前的比賽結束後立即開始在<w:t>標籤,。由於[^<\s]與關閉</w:t>標記(或任何其他標記)不匹配,所以每個匹配都保證位於<w:t>元素內。

要做到這一點正確,你將需要處理一些問題,如:

  • \s其他幾種空白的,不只是' '匹配。你想用%SPACE%替代任何空格字符嗎?或者你知道' '將是這些元素中唯一的空白嗎?

  • <w:t>元素內部是否還有其他元素(例如<w:t> test <xyz> test </xyz> </w:t>)?如果是這樣,正則表達式變得更加複雜,但它仍然是可行的。

我沒有設置測試的ActionScript,但這裏的PHP中的演示,它使用PCRE庫的引擎蓋下,像AS3:
test it on ideone.com

編輯:除了匹配最後匹配關閉的位置,\G與輸入的開頭匹配,就像\A一樣。這不是這裏給出的正則表達式的問題,但在ideone演示中是這樣的。這正則表達式應該是

((?:<w:t>|\G(?!\A))(?:[^<\s]++|<(?!/w:t>))*+)\s 
1

當使用ActionScript中的標準XML類,你可以指定不被ignoreWhiteSpace屬性設置爲false忽略空白解析XML。它默認設置爲true。這將確保保留XML文本節點中的空白區域。然後你可以隨心所欲地做任何事情。

XML.ignoreWhiteSpace = false 
/* parse your XML here */ 

這樣你就不必使用正則表達式,並且可以使用標準的XML ActionScript解析。