I am trying to have a regular expression split on equations like 1.5+4.2*(5+2) with operators - + * / so the output would be input into a array so I can parse individually
[0]1.5
[1]+
[2]4.2
[3]*
[4](
[5]5
[6]+
[7]2
[8])
I have found out that the \\b
will work on 1+2+3
however if I were to have decimal points it would not split.
I have tried splitting with \\b(\\.\\d{1,2})
however it does not split on the decimal point
You can use zero-width matching lookahead and lookbehind combo as alternates.
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, )]
[…]
is a character class definition (?<=…)
is a lookbehind; it asserts that we can match …
to the left(?=…)
is a lookahead; it asserts that we can match …
to the rightthis|that
is alternation (?<=op)|(?=op)
matches everywhere after or before op
op
is replaced by [-+*/()]
, ie a character class that matches operators
-
is first here so that it doesn't become a range definition meta character(?<=#)[^#]+(?=#)
work? Here are more examples of splitting on zero-width matching constructs; this can be used to split a string but also keep delimiters.
Simple sentence splitting, keeping punctuation marks:
String str = "Really?Wow!This.Is.Awesome!";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[.!?])")
)); // prints "[Really?, Wow!, This., Is., Awesome!]"
Splitting a long string into fixed-length parts, using \\G
String str = "012345678901234567890";
System.out.println(java.util.Arrays.toString(
str.split("(?<=\\G.{4})")
)); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
Split before capital letters (except the first!)
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
)); // prints "[Oh, My, God]"
A variety of examples is provided in related questions below.
"abc<def>ghi<x><x>" -> "abc", "<def>", "ghi", "<x>", "<x>"
"AnXMLAndXSLT2.0Tool" -> "An XML And XSLT 2.0 Tool"
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
You can also use ?: to avoid capturing groups. I left it to make it simple.
Use match, instead of split:
(?:\d+\.)?\d*(?:e[+\-]?\d+)?|[\s\-\/()+*%=]
This regex will also accept valid floats like: 1.2e+3 * 2
which should equal 2400
. the regexes given by the other respondents will fail.
使用[+-/*()]
拆分字符串。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.