Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 是否可以从xsl:analyze string中的重复正则表达式组中捕获值?_Regex_Xslt - Fatal编程技术网

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>