简体   繁体   中英

Regex in Java with multiple condition to extract arithmetic operator

I am new to regular expression syntax, after one whole day digging on the google, still can't find a good regex in java to extract the thing I want from a string... for example:I have a

stringA = "-3.5 + 2 * 3 / 2"
stringB = "2 * 3 / 2 - 3.5"; 

the regex i used was

regex="[\\+\\-\\*\\/]", -->choose +,-,*,or / from the target;

by doing this, I am able to capture ANY signs in the string including negative sign.

However, I was to capture the negative sign(-) only when it is following by a whitespace.

That is, I want the result from

string A as [ +, *, /], these three signs and stringB as [ *, / , -]

I realized I only need to add another condition into regex for the negative sign such as

regex = "[\\+{\\-\\s}\\*\\/]"  ---> I want to choose same thing but with 
                            extra condition "-"sign has to follow by a whitespace.

the square bracket does not work like this way..Is there anyone can kindly guide my how to add another condition into the original regex? or write a new regex to qualify the need? Thank you so much in advance.

Chi, this might be the simple regex you're looking for:

[+*/]|(?<=\s)-

How does it work?

There is an alternation | in the middle, which is a way of saying "match this or match that."

On the left, the character class [+*/] matches one character that is a +, * or /

On the right, the lookbehind (?<=\\s) asserts "preceded by a whitespace character", then we match a minus.

How to use it?

List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("[+*/]|(?<=\\s)-");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

If you are interested, you may want to read up on regex lookaheads and lookbehinds .

Let me know if you have any question.

What you can do is ditch the class (the [] enclosed Pattern ), use OR instead, and use a negative lookahead for your minus sign, to avoid for it to be followed by a digit:

String input0 = "2 * 3 / 2 - 3.5";
String input1 = "-3.5 + 2 * 3 / 2";
Pattern p = Pattern.compile("\\+|\\-(?!\\d)|\\*|/");
Matcher m = p.matcher(input0);
while (m.find()) {
    System.out.println(m.group());
}
System.out.println();
m = p.matcher(input1);
while (m.find()) {
    System.out.println(m.group());
}

Output

*
/
-

+
*
/

Try String#replaceAll() . Its very simple pattern.

    // [any digit] or [minus followed by any digit] or [decimal]
    String regex = "(\\d|-\\d|\\.)";

    String stringA = "-3.5 + 2 * 3 / 2";
    String stringA1 = stringA.replaceAll(regex, "").trim();
    System.out.println(stringA1);

    String stringB = "2 * 3 / 2 - 3.5";
    String stringB1 = stringB.replaceAll(regex, "").trim();
    System.out.println(stringB1);

output

+  *  /
*  /  -

Note : You can get all the operators using String#split("\\\\s+") .

Yet another solution.

Maybe you want to catch the minus sign regardless of white spaces and rather depending on its meaning, ie a binary-minus operator and not the minus sign before the numbers.

You could have the case where you could have a binary-minus without any space at all, like in 3-5 or you could have a minus sign before the number with a space between them (which it is allowed in many programming languages, Java included). So, in order to catch your tokens properly (positive-negative-numbers and binary-operators) you can try this:

public static void main(String[] args) {
    String numberPattern = "(?:-? *\\d+(?:\\.\\d+)?(?:E[+-]?\\d+)?)";
    String opPattern = "[+*/-]";
    Pattern tokenPattern = Pattern.compile(numberPattern + "|" + opPattern);


    String stringA = "-3.5 + -2 * 3 / 2";

    Matcher matcher = tokenPattern.matcher(stringA);
    while(matcher.find()) {
        System.out.println(matcher.group().trim());
    }

}

Here you are catching operators AND ALSO operands, regardless of white spaces. If you only need the binary operators, just filter them.

Try with the string "-3.5+-2*3/2" (without spaces at all) and you'll have your tokens anyway.

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM