regexp:仅匹配指定符号内的单独数字

时间:2017-02-21 19:20:43

标签: java regex

我在java中使用正则表达式,无法弄清楚如何只匹配预定义符号中的数字。

这是我的一个字符串的示例:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[applic/model/version/@version='ABCD']" />

</xsl:stylesheet>

是否真的可以只检索方括号中的数字?在这种情况下:1 11 1 3 6 7 5 16 这不应与方括号中的任何其他符号匹配。

我已经尝试了几个选项,包括:

some text [1] some and numbers 12, 14 and more text [11,1] another text [3,6, 7] and some more text [5;16]

但这仅适用于一个数字而非其他数字。我试图将它们分组,例如Pattern k = Pattern.compile("\\[(\\d+)\\]"); 没有任何成功。

更新

分组的解决方法: (?:\\[) some code inside (?:\\]) 但是生成括号和逗号作为输出。

3 个答案:

答案 0 :(得分:3)

您可以选择这些数字,您可以使用以下正则表达式:

(?:\G|\[)[,;\s]*(\d+)

它只选择数字。

See the demo

解释

  • (?:\G|\[)匹配上一场比赛的结束位置一个左括号
  • [,;\s]*匹配逗号,分号或空格零或多次
  • (\d+)捕获数字

您将拥有第1组中的数字。

答案 1 :(得分:1)

只是提供一种不同的解决方法,当它变得更加复杂时可能会派上用场:

实现目标的一种更简单的方法是将匹配分为两个阶段。首先,将括号的出现与

匹配
Pattern areas = Pattern.compile("\\[.*?\\]");

将导致[1] [11,1] [3,6, 7] [5;16]

然后对于其中任何一个使用像

这样的东西
Pattern numbers = Pattern.compile("\d+");

匹配实际数字。

答案 2 :(得分:0)

可能这个会帮助你。

试一试:

 Pattern k = Pattern.compile("\\[(\\d+)(;?)(\\d+)\\]");