如果结果取决于以前的匹配,如何返回多个regexp匹配?
我一直在尝试匹配自由文本字段中的危险代码。我有一个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代码,有时在上面的示例中有分隔符,有时没有。因此,我
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}
regexecho“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}
regexecho“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完成,但我现在已经得到了我想要的输出。再次感谢大家!