2011-02-03 92 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解析。