regex replace()中的正则表达式

9rnv2umw  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(101)

当我尝试在一个转换中替换一段文本中的多个空格时,我遇到了一个问题。我觉得我忽略了一些简单的东西,但我就是看不到。

简单示例:

<para>Doors 1 (<extref targetid="REF1034248349404" id="abc-123"/>) and 2  (<extref targetid="REF1034248370394" id="xyz-123"/>) closed, for temporary installation see <xref xrefid="def-123"/>
</para>

简单模板:

<xsl:template match="para">
  <p>Text as is</p>
    <xsl:for-each select="text()/normalize-space()">
        <text><xsl:value-of select="."/></text>
    </xsl:for-each>
    <p>Text with '\s+' replaced with '*'</p>
    <xsl:for-each select="text()/normalize-space()">
        <text><xsl:value-of select="replace(., '\s+', '*')"/></text>
    </xsl:for-each>
</xsl:template>

预期输出:

<p>Text as is</p>
<text>Doors 1 (</text>
<text>) and 2  (</text>
<text>) closed, for temporary installation see</text>
<text/>
<p>Text with '\s+' replaced with '*'</p>
<text>Doors*1*(</text>
<text>)*and*2*(</text>
<text>)*closed,*for*temporary*installation*see</text>
<text/>

实际产量:

<p>Text as is</p>
<text>Doors 1 (</text>
<text>) and 2  (</text>
<text>) closed, for temporary installation see</text>
<text/>
<p>Text with '\s+' replaced with '*'</p>
<text>Doors*1*(</text>
<text>)*and*2* (</text>
<text>)*closed,*for*temporary*installation*see</text>
<text/>

注意第二个<text>元素中的额外空间。'\s+'找不到'2'字符后的多个空格(我相信是2个)的原因是什么?
像往常一样,任何和所有的帮助都很感激。

mkh04yzy

mkh04yzy1#

经过一个新的方法来调试它,我发现我的问题。我把我的样本,并运行他们与撒克逊通过Python(saxoncee)。在运行我的原始XSL并使用lxml将输出打印到终端时,我发现了罪魁祸首:

<test>
 <p>Text as is</p>
 <text>Doors 1 (</text>
 <text>) and 2 &#160;(</text>
 <text>) closed, for temporary installation see</text>
 <text/>
 <p>Text with '\s+' replaced with '*'</p>
 <text>Doors*1*(</text>
 <text>)*and*2*&#160;(</text>
 <text>)*closed,*for*temporary*installation*see</text>
 <text/>
</test>

源代码中有一个不间断的空格字符。我修改了XSL如下:

<xsl:template match="para">
    <p>Text as is</p>
    <xsl:for-each select="text()/normalize-space()">
        <text><xsl:value-of select="."/></text>
    </xsl:for-each>
    <p>Text with '\s+' replaced with '*'</p>
    <xsl:for-each select="text()/normalize-space()">
        <text><xsl:value-of select="replace(., '\p{Z}+', '*')"/></text>
    </xsl:for-each>
</xsl:template>

现在得到所需的输出:

<test>
 <p>Text as is</p>
 <text>Doors 1 (</text>
 <text>) and 2 &#160;(</text>
 <text>) closed, for temporary installation see</text>
 <text/>
 <p>Text with '\s+' replaced with '*'</p>
 <text>Doors*1*(</text>
 <text>)*and*2*(</text>
 <text>)*closed,*for*temporary*installation*see</text>
 <text/>
</test>

从这篇文章中得到了一些帮助:XSL - Remove non breaking space

相关问题