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,37.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。组是您在正则表达式中特别分组的。括号中的任何内容都是一个组(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());
}