Regex 是否可以从xsl:analyze string中的重复正则表达式组中捕获值?
我想这样做:Regex 是否可以从xsl:analyze string中的重复正则表达式组中捕获值?,regex,xslt,Regex,Xslt,我想这样做: <xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)+"> <xsl:matching-substring> <xsl:for-each select="regex-group(1)"> <letter><xsl:value-of select="." /></letter> </xsl:for-each>
<xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)+">
<xsl:matching-substring>
<xsl:for-each select="regex-group(1)">
<letter><xsl:value-of select="." /></letter>
</xsl:for-each>
</xsl:matching-substring>
</xsl:analyze-string>
一般问题是处理可能以未知顺序出现的已知值。
xsl:analyze string
将在字符串中自动重复和匹配多次。如果重写表达式以匹配子字符串,而不是使用锚和/或显式重复组一次匹配整个字符串,则可以获得正确的输出:
<xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)">
<xsl:matching-substring>
<letter><xsl:value-of select="regex-group(1)" /></letter>
</xsl:matching-substring>
</xsl:analyze-string>
将此正则表达式重写为(1 | 2 | 3 | 4)|(A | B | C | D)
,仍然可以获得以下结果(用作输入21CB
):
2
1.
C
B
但是重写的正则表达式也会匹配
AB12
,1A3C
,等等,它们都不匹配原始表达式。如果有人对此有更好的解决方案,我会非常感兴趣。理想的解决方案是保留以前对重复组的捕获,如在.NET中。不幸的是,xsl:analyze字符串将只捕获最后一个匹配项。这是因为它被设计成可以使用广泛使用的正则表达式引擎来实现,而许多正则表达式引擎都有这个限制;您的示例非常简单,很难从中推断出真正的需求是什么。@MichaelKay一个不那么简单的示例可能是将URL解析为其组成部分:(https?://mydomain.com)(/search |/browse)([\?&;](q=.*A=.*b=.*){1,3}
答案是将问题分解为几个部分。更具体地说,将URI分解为多个部分,然后分别检查它们。不要依赖一个怪物正则表达式来完成整个工作。
<letter>D</letter>
<xsl:analyze-string select="'ABCD'" regex="(A|B|C|D)">
<xsl:matching-substring>
<letter><xsl:value-of select="regex-group(1)" /></letter>
</xsl:matching-substring>
</xsl:analyze-string>
<letter>A</letter>
<letter>B</letter>
<letter>C</letter>
<letter>D</letter>
(1|2|3|4)+(A|B|C|D)+
<number>2</number>
<number>1</number>
<letter>C</letter>
<letter>B</letter>