1

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

  • 对于7.0 + 5 - :asc + (8.256 - :b)^2 + :d/3: 7.0 , 5 , :asc , 8.256 , :b , 2 , :d , 3
  • 对于-+*-/^^ )ç@:没有

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

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

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

4

3 回答 3

3

组是您在正则表达式中专门分组的内容。括号中的任何内容都是一个组。(Hello) World有1组,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);

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

7.0
5
:asc
8.256
:b
2
:d
3

这里groups有一些关于java的更多信息。

这有帮助吗?

于 2013-01-04T21:46:22.303 回答
0
([^\()+\-*\s])+ //put any mathematical operator inside square bracket
于 2013-01-04T21:48:08.527 回答
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清楚地说

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

于 2013-01-04T22:03:04.693 回答