正则表达式 - 匹配数字&特别案例

时间:2013-01-04 21:42:55

标签: java regex math

我试图制作一个会产生以下结果的正则表达式:

  • 适用于7.0 + 5 - :asc + (8.256 - :b)^2 + :d/3 7.0 5 :asc 8.256 :b 2 :d 3
  • for -+*-/^^ )ç@:nothing

它应该首先匹配可以浮动的数字,所以在我的正则表达式中我有:[0-9]+(\\.[0-9])?但它也应该是特殊情况,例如:a ::ABC

更确切地说,它应该(如果可能)匹配除数学运算符 / * + ^ - 和括号之外的任何内容。

所以这是我的最终正则表达式:([0-9]+(\\.[0-9])?)|(:[a-zA-Z]+)但它无效,因为matcher.groupCount()为我给出的两个示例都返回 3

3 个答案:

答案 0 :(得分:3)

群组是您在正则表达式中专门分组的内容。括号中包围的任何东西都是一个组。 (Hello) World有一个小组,Hello。你需要做的是找到所有的比赛。

在您的代码([0-9]+(\\.[0-9])?)|(:[a-zA-Z]+)中,可以看到3组括号。这就是为什么每场比赛总会给你3组。

您的代码可以正常工作,这是一个示例:

String text = "7.0 + 5 - :asc + (8.256 - :b)^2 + :d/3";

Pattern p = Pattern.compile("([0-9]+(\\.[0-9]+)?)|(:[a-zA-Z]+)");
Matcher m = p.matcher(text);

List<String> matches = new ArrayList<String>();
while (m.find()) matches.add(m.group());

for (String match : matches) System.out.println(match);

ArrayList matches将包含正则表达式找到的所有匹配项。 我做的唯一更改是在第二个+之后添加[0-9]。 这是输出:

7.0
5
:asc
8.256
:b
2
:d
3

Here是关于java中groups的更多信息。

这有帮助吗?

答案 1 :(得分:0)

([^\()+\-*\s])+ //put any mathematical operator inside square bracket

答案 2 :(得分:0)

您的正则表达式是正确的,请运行以下代码:

    String input = "7.0 + 5 - :asc + (8.256 - :b)^2 + :d/3"; // your input
    String regex = "(\\d+(\\.\\d+)?)|(:[a-z-A-Z]+)"; // exactly yours.
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }

您的问题是对方法matcher.groupCount()的理解。 JavaDoc清楚地说

  

返回此匹配器模式中的捕获组数。

相关问题