用正则表达式分割一个简单的数学表达式
我试图将正则表达式拆分为1.5 + 4.2 *(5 + 2)等方程式与运算符 – + * /所以输出将输入到数组中,以便我可以单独解析
[0]1.5 [1]+ [2]4.2 [3]* [4]( [5]5 [6]+ [7]2 [8])
我发现\b
将在1+2+3
但是如果我有小数点则不会分裂。
我尝试用\b(\.\d{1,2})
拆分,但它不会在小数点上拆分
Pattern pattern = Pattern.compile("((\\d*\\.\\d+)|(\\d+)|([\\+\\-\\*/\\(\\)]))"); Matcher m = pattern.matcher("1.5+4.2*(5+2)/10-4"); while(m.find()) { System.out.printf("%s ", m.group()); } output: 1.5 + 4.2 * ( 5 + 2 ) / 10 - 4
您还可以使用?:来避免捕获组。 我把它留下来让它变得简单。
您可以使用零宽度匹配前瞻和后视组合作为替代。
String equation = "1.5+4.2*(5+2)"; String regex = "(?<=op)|(?=op)".replace("op", "[-+*/()]"); // actual regex becomes (?<=[-+*/()])|(?=[-+*/()]) System.out.println(java.util.Arrays.toString( equation.split(regex) )); // ___ _ ___ _ _ _ _ _ _ // [1.5, +, 4.2, *, (, 5, +, 2, )]
说明
-
[…]
是一个字符类定义 -
(?<=…)
是一个外观; 它断言我们可以匹配…
到左边 -
(?=…)
是一个先行者; 它声称我们可以匹配…
到右边 -
this|that
是交替 - 因此,
(?<=op)|(?=op)
匹配(?<=op)|(?=op)
之后或之前的任何地方- ...其中
op
被[-+*/()]
替换,即匹配运算符的字符类- 请注意
-
首先是这里,因此它不会成为范围定义元字符
- 请注意
- ...其中
参考
- regular-expressions.info/Lararounds和Alternation with Vertical Bar and Character Class
相关问题
- 正则表达式
(?<=#)[^#]+(?=#)
工作? - 正则表达式:为什么[01-12]范围不按预期工作?
更多用于拆分的零宽度匹配正则表达式的示例
以下是分割零宽度匹配结构的更多示例; 这可以用来分割字符串,但也保留分隔符。
简单的句子分裂,保持标点符号:
String str = "Really?Wow!This.Is.Awesome!"; System.out.println(java.util.Arrays.toString( str.split("(?<=[.!?])") )); // prints "[Really?, Wow!, This., Is., Awesome!]"
使用\G
将长字符串拆分为固定长度的部分
String str = "012345678901234567890"; System.out.println(java.util.Arrays.toString( str.split("(?<=\\G.{4})") )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
在大写字母之前拆分(第一个除外!)
System.out.println(java.util.Arrays.toString( "OhMyGod".split("(?=(?!^)[AZ])") )); // prints "[Oh, My, God]"
以下相关问题中提供了各种示例。
相关问题
- 你能在String split中使用零宽度匹配正则表达式吗?
-
"abc
ghi " -> "abc", " ", "ghi", " ", " "
-
- 如何在Java中将CamelCase转换为人类可读的名称?
-
"AnXMLAndXSLT2.0Tool" -> "An XML And XSLT 2.0 Tool"
- C#版本: 是否有一种优雅的方法来解析单词并在大写字母之前添加空格
-
- Java分裂正在吃我的角色
- 有没有办法用String.split()分割字符串并包含分隔符?
- 正则表达式拆分字符串但保留分隔符
使用匹配,而不是拆分:
(?:\d+\.)?\d*(?:e[+\-]?\d+)?|[\s\-\/()+*%=]
这个正则表达式也将接受有效的浮点数: 1.2e+3 * 2
,它应该等于2400
。 其他受访者给出的正则数据将失败。
使用[+-/*()]
拆分字符串。