Java中的正则表达式具有多个条件来提取算术运算符

时间:2014-04-23 06:32:16

标签: java regex

我是正则表达式语法的新手,经过一整天挖掘谷歌,仍然无法在java中找到一个好的正则表达式从字符串中提取我想要的东西... 例如:我有一个

stringA = "-3.5 + 2 * 3 / 2"
stringB = "2 * 3 / 2 - 3.5"; 
我使用的正则表达式是

regex="[\\+\\-\\*\\/]", -->choose +,-,*,or / from the target;
通过这样做,我能够捕获字符串中的任何符号,包括负号。

然而,我只是在跟随空格时才捕获负号( - )。

也就是说,我想要

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

我意识到我只需要在正则表达式中为负号添加另一个条件,例如

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

方括号不能正常工作就像这样......是否有人可以指导我如何在原始正则表达式中添加另一个条件?或写一个新的正则表达式来满足需要?非常感谢你提前。

4 个答案:

答案 0 :(得分:1)

Chi,这可能是你正在寻找的简单正则表达式:

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

它是如何运作的?

中间有一个替换|,这是一种说“匹配或匹配”的方式。

在左侧,字符类[+*/]匹配一个字符,即+,*或/

在右边,lookbehind (?<=\s)断言“前面有一个空格字符”,然后我们匹配一个减号。

如何使用?

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
}

如果您有兴趣,可以阅读regex lookaheads and lookbehinds

如果您有任何疑问,请与我联系。

答案 1 :(得分:0)

你可以做的是抛弃课程([]封闭Pattern),改为使用OR,并使用负前瞻作为减号,以避免它出现接着是一个数字:

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());
}

<强>输出

*
/
-

+
*
/

答案 2 :(得分:0)

试试String#replaceAll()。它非常简单。

    // [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);

输出

+  *  /
*  /  -

注意:您可以使用String#split("\\s+")

获取所有运营商

答案 3 :(得分:0)

又一种解决方案。

也许你想要抓住减号而不管白色空间,而不是取决于它的含义,i。即二进制减运算符,而不是数字前的减号。

你可能会遇到这样的情况:你可以有一个二进制减去而没有任何空间,比如3-5,或者你可以在数字之前加一个减号,并且它们之间有一个空格(在许多编程语言,包括Java)。因此,为了正确捕获您的令牌(正负数和二元运算符),您可以尝试这样做:

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());
    }

}

无论白色空格如何,您都在这里捕捉运算符和ALSO操作数。如果您只需要二元运算符,只需过滤它们。

尝试使用字符串"-3.5+-2*3/2"(根本没有空格),无论如何你都会拥有你的代币。