I need to split a string on any of the following sequences:
1 or more spaces
0 or more spaces, followed by a comma, followed by 0 or more spaces,
0 or more spaces, followed by "=>", followed by 0 or more spaces
Haven't had experience doing Java regexs before, so I'm a little confused. Thanks!
Example:
add r10,r12 => r10
store r10 => r1
Just create regex matching any of your three cases and pass it into split
method:
string.split("\\s*(=>|,|\\s)\\s*");
Regex here means literally
\\s*
)=>|,|\\s
)\\s*
)You can replace whitespace \\s
(detects spaces, tabs, line breaks, etc) with plain space character if necessary.
For simplicity, I'm going to interpret you indication of "space" () as "any whitespace" (
\s
).
Translating your spec more or less "word for word" is to delimit on any of:
\s+
\s*
), followed by a comma (,
), followed by 0 or more spaces (\s*
)
\s*,\s*
\s*
), followed by a "=>" (=>
), followed by 0 or more spaces (\s*
)
\s*=>\s*
To match any of the above: (\s+|\s*,\s*|\s*=>\s*)
However, your spec can be "reduced" to:
\s*
,(\s|,|=>)
\s*
Put it all together: \s*(\s|,|=>)\s*
The reduced form gets around some corner cases with the strictly translated form that makes some unexpected empty "matches".
Here's some code:
import java.util.regex.Pattern;
public class Temp {
// Strictly translated form:
//private static final String REGEX = "(\\s+|\\s*,\\s*|\\s*=>\\s*)";
// "Reduced" form:
private static final String REGEX = "\\s*(\\s|=>|,)\\s*";
private static final String INPUT =
"one two,three=>four , five six => seven,=>";
public static void main(final String[] args) {
final Pattern p = Pattern.compile(REGEX);
final String[] items = p.split(INPUT);
// Shorthand for above:
// final String[] items = INPUT.split(REGEX);
for(final String s : items) {
System.out.println("Match: '"+s+"'");
}
}
}
Output:
Match: 'one'
Match: 'two'
Match: 'three'
Match: 'four'
Match: 'five'
Match: 'six'
Match: 'seven'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With