我希望匹配属性的多个值以进行替换。例如
<div class="div h1 full-width"></div>
应该生成div,h1和全宽作为单独的匹配。 我想这样做来为类添加前缀。因此,而不是div h1全宽,它应该是pre-div pre-h1 pre-full-width
我有正规的正则表达式
(?<=class=["'])(\b-?[_a-zA-Z]+[_a-zA-Z0-9-]*\b)+
这只匹配第一堂课。这是幕后的原因,因为这是这种模式应该匹配的唯一东西:(我试图让lookbehind更多,然后只是class =“但我最终得到它采取每一个并留下任何东西来取代。 我想创建一个模式,它在class属性的引号之间单独匹配任何值。
我想为处理所有文件的Ant构建脚本执行此操作,并使用set前缀替换class =“value1 value2 value3”。我已经完成了这个,在替换css文件中的类时遇到了一些麻烦,但是你们看起来很麻烦。
这是一个Ant buildcript。 Java regexp package用于处理模式。使用的ant标记是:replaceregexp
上述模式的实现是:
<target name="prefix-class" depends="">
<replaceregexp flags="g">
<regexp pattern="(?<=class=['"])(\b-?[_a-zA-Z]+[_a-zA-Z0-9-]*\b)+"/>
<substitution expression=".${prefix}\1"/>
<fileset dir="${dest}"/>
</replaceregexp>
</target>
答案 0 :(得分:0)
我认为你不能在一个简单的正则表达式中找到n(或在你的情况下为3)不同的类条目并将它们替换。如果你需要在ant中执行此操作,我认为你必须编写自己的ant任务。更好的方法是xslt,你熟悉xslt吗?
答案 1 :(得分:0)
放弃Ants ReplaceRegExp并使用XSLT对我的问题进行排序,将xhtml转换为xhtml。
以下代码为元素类属性的所有值添加前缀。必须正确格式化xhtml源文档才能进行解析。
<xsl:stylesheet version="2.0"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xhtml xsl xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd"
indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="prefix" select="'oo-'"/>
<xsl:template match="/">
<xsl:apply-templates select="./@*|./node()" />
</xsl:template>
<!--remove these atts from output, default xhtml values from dtd -->
<xsl:template match="xhtml:a/@shape"/>
<xsl:template match="@rowspan"/>
<xsl:template match="@colspan"/>
<xsl:template match="@class">
<xsl:variable name="replace_regex">
<xsl:value-of select="$prefix"/>
<xsl:text>$1</xsl:text>
</xsl:variable>
<xsl:attribute name="class">
<xsl:value-of select="fn:replace( . , '(\w+)' , $replace_regex )"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>