Java 正则表达式-匹配数字和;特例

Java 正则表达式-匹配数字和;特例,java,regex,math,Java,Regex,Math,我正在尝试制作一个正则表达式,它将产生以下结果: 对于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-

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

  • 对于
    7.0+5-:asc+(8.256-:b)^2+:d/3
    7.05:asc8.256:b2:d3
  • 对于
    -+*-/^)ç@
    :无
它应该首先匹配可以浮动的数字,所以在我的正则表达式中我有:
[0-9]+(\\[0-9])?
,但它也应该有一些特殊情况,比如:a:Abc

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


这是我的最后一个正则表达式:
([0-9]+(\\.[0-9]))|(:[a-zA-Z]+)
,但它不起作用,因为
matcher.groupCount()
对我给出的两个示例都返回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);
是关于java中
组的更多信息


这有帮助吗?

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

([^\()+\-*\s])+ //put any mathematical operator inside square bracket
    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()
。清楚地说

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


你想做一个数学表达式解析器吗?如果是,请不要为此使用正则表达式模式中有3个组,因此
matcher.groupCount()
将始终返回3(无论输入是什么)。读一下。@caiosm1005是的,没错。你能解释一下原因吗?@miNde-基本上是出于同样的原因。数学表达式不是正则的。解析字符串需要几个步骤,包括标记化和标记分析。如果你想深入研究一下,请看。@miNde我也试过一次你在用正则表达式做什么,所以,凭经验来说,仅仅依靠正则表达式和一些例外规则会变得一团糟,最终你无法完全解决。你试过了吗?根据OP的输入运行此正则表达式不会产生他想要的输出。它仍然匹配
^
。这不在他想要的输出中。@jlordo op声明匹配
除数学运算符以外的任何东西。。但是我添加
\s
以排除空格。他表达的不够清楚,但他的示例显示了这一点。您的正则表达式仍然匹配OP解释为数学幂运算符的
^
。有趣的是,它不应该匹配^在[]内表示“不”。不,我没有测试,我不是选民。但你为什么要改变他的正则表达式?它工作得很好。天哪,那只是。。。非常感谢。所以我别无选择,只能使用find()循环以获取表达式中匹配正则表达式的组数?我想知道为什么没有类似size()的方法。没问题!^ u^是的,在Python中,您可以通过
re.findall()
简单地创建一个列表。我不知道为什么要在Java中循环它,但我想这没什么大不了的。
    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());
    }