Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
如果结果取决于以前的匹配,如何返回多个regexp匹配?_Regex_Xslt 2.0 - Fatal编程技术网

如果结果取决于以前的匹配,如何返回多个regexp匹配?

如果结果取决于以前的匹配,如何返回多个regexp匹配?,regex,xslt-2.0,Regex,Xslt 2.0,我一直在尝试匹配自由文本字段中的危险代码。我有一个regexp,它可以在以Hxxx格式输入代码的地方工作,其中xxx是一个三位数。轻松点 但是,有时用户输入的第一个值为Hxxx,但随后的值为xxx 因此,对于输入数据,如 R12 34 456 / H123 H456 789 012 我想匹配H123H456和789和012,但不匹配第一个H之前的456 编辑:为了澄清,字段中的数据没有清晰的模式。大多数情况下,有一些H代码,有时在它们前面有R代码,有时在上面的示例中有分隔符,有时没有。因此,我

我一直在尝试匹配自由文本字段中的危险代码。我有一个regexp,它可以在以
Hxxx
格式输入代码的地方工作,其中xxx是一个三位数。轻松点

但是,有时用户输入的第一个值为
Hxxx
,但随后的值为
xxx

因此,对于输入数据,如

R12 34 456 / H123 H456 789 012
我想匹配
H123
H456
789
012
,但不匹配第一个
H
之前的
456

编辑:为了澄清,字段中的数据没有清晰的模式。大多数情况下,有一些H代码,有时在它们前面有R代码,有时在上面的示例中有分隔符,有时没有。因此,我设想的规则是,以
H
开头的一个代码后面的三位数代码将被返回,但前面没有至少一个H代码的任何代码都将被忽略

我已经尝试了我能想到的每一种可选分组组合和“回头看”,我得到的最好结果是

((H|(?<=(H\d{3}\s)))\d{3}[A-Z]{0,2})

((H |)(?您可以使用Saxon 9.6或更高版本的PE和EE(例如在oXygen或Stylus Studio中)或Altova XMLSpy 2017或Exselt和XSLT 3.0吗?在这种情况下,您可以简单地
标记($data,“\s+”)
并使用
xsl:for每个以=“.[matches(,'H[0-9]{3}')]”开头的组

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:template match="data">
        <xsl:copy>
            <xsl:variable name="matches" as="xs:string*">
                <xsl:for-each-group select="tokenize(., '\s+')"
                    group-starting-with=".[matches(., 'H[0-9]{3}')]">
                    <xsl:if test="matches(., 'H[0-9]{3}')">
                        <xsl:sequence select="current-group()"/>
                    </xsl:if>
                </xsl:for-each-group>               
            </xsl:variable>
            <xsl:value-of select="$matches"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>


R12 34 456/H123 H456 789 012
转换为
H123 H456 789 012
以便提取您正在寻找的项目。

您可以使用Saxon 9.6或更高版本的PE和EE(例如在Oxon或Stylus Studio中)或Altova XMLSpy 2017或Exselt和XSLT 3.0吗?在这种情况下,您可以简单地
标记($data,“\s+”)
并对以=“[matches(,'H[0-9]{3}')”开头的每个组使用
xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:template match="data">
        <xsl:copy>
            <xsl:variable name="matches" as="xs:string*">
                <xsl:for-each-group select="tokenize(., '\s+')"
                    group-starting-with=".[matches(., 'H[0-9]{3}')]">
                    <xsl:if test="matches(., 'H[0-9]{3}')">
                        <xsl:sequence select="current-group()"/>
                    </xsl:if>
                </xsl:for-each-group>               
            </xsl:variable>
            <xsl:value-of select="$matches"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>


R12 34 456/H123 H456 789 012
转换为
H123 H456 789 012
,因此它将提取您要查找的项目。

只需使用
/
拆分字符串(或在第一个
/
之后获取子字符串),然后使用空格拆分或使用
H?\d{3}[A-Z]{0,2}
regex
echo“R12 34 456/H123 H456 789 012”| cut-d/-f2 | tr-d H
,也许?或者,也许更好,
回音“R12 34 456/H123 H456 789 012”| cut-d/-f2 | grep-oP'\d{3}'
。不确定您是否意识到后面看(
(?从输入字符串的单个示例中执行此操作有点困难。您还没有告诉我们一般规则,例如“/”是否重要,H代码是否始终跟随“/”,您是否只想返回“/”之后的所有令牌,而不管是否存在“H”“?谢谢大家的建议。我已经编辑了主要问题以澄清模式。对于最初的含糊不清表示歉意。我怀疑XPath不支持lookback,但由于我甚至无法让lookback执行我想要的操作,这其实并不太重要。只需使用
/
拆分字符串即可。”(或者在第一个
/
之后获取子字符串),然后用空格分割,或者使用
H?\d{3}[A-Z]{0,2}
regex
echo“r123456/h123h456789012”| cut-d/-f2 | tr-dh
,或者更好的是,
echo“r123456/h123h456 789012”| cut-d/-f2 | grep-oP'\d}“
。不确定您是否意识到look behind(
)(?从单个输入字符串示例中执行此操作有点困难。您还没有告诉我们一般规则,例如“/”是否重要,H代码是否始终跟随“/”,您是否只想返回“/”之后的所有标记,而不管是否存在“H”?谢谢大家的建议。我已经编辑了主要问题以澄清模式。对于最初的含糊不清表示歉意。我怀疑XPath不支持lookback,但由于我甚至不能让lookback做我想做的事情,这其实并不重要。由于我使用的是旧版本的Saxon,因此需要对其进行一些修改rstly将标记化字符串转换为一系列节点,但原理非常有效。很遗憾,它不能作为regexp完成,但我现在得到了我想要的输出。再次感谢大家!由于我使用的是旧版本的Saxon,这需要稍加修改,首先将标记化字符串转换为一系列节点,但是rinciple工作得很好。很遗憾它不能作为regexp完成,但我现在已经得到了我想要的输出。再次感谢大家!