捕获除特定正则表达式之外的所有内容

时间:2016-02-12 02:03:49

标签: java regex

我在尝试实现一些正则表达式时遇到了一些麻烦。我需要捕获除一个特定运算符之外的所有内容所以这就是格式:

分数运算符分数

这是当前的正则表达式:

([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*)

现在,它捕获了两个分数,但我需要它才能获得操作员。例如,如果我输入:

-12/43 - 3/-5

它会捕获-12/433/-5。我需要它来捕捉除了那之外的一切;我需要它来捕捉中间的操作员。

我已经尝试了一段时间,但我得到了不同的答案,详细说明了如何做到这一点。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

一个相当简单的方法来做你要求的就是用""替换你的分数 - 然后你剩下的就是算子。

Pattern fraction = Pattern.compile("\\s*-?\\d+\\s*/\\s*-?\\d+\\s*");
Matcher matcher = fraction.match(myExpression);
String operator = matcher.replaceAll("").trim();

operator变量现在是原始表达式,所有子串都与已删除的分数模式匹配。

请注意,我已将预定义的字符类用于空格和数字。

虽然这应该有效但我不推荐这种方法。假设你想要对表达式做一些事情(比如评估它),你最好使用一个合适的词法&语义分析技术。有第三方库(例如JFlex)可以用很少的工作量和更大的灵活性完成工作。

答案 1 :(得分:0)

尝试使用捕获组:

/(?:\s*-?\d+\s*\/\s*-?\d+)\s*([*/+-])\s*(?:\s*-?\d+\s*\/\s*-?\d+)/ig

我会解释这里发生的事情。我们有三个捕获组:2个是非捕获组(?:.*)和一个捕获组(.*)。当捕获组围绕您正在寻找的运算符[*/+-]时,非捕获组围绕着您忽略的分数。现在您可以通过以下方式获得运营商:

Pattern pattern = Pattern.compile("(?:\\s*-?\\d+\\s*\\/\\s*-?\\d+)\\s*([*/+-])\\s*(?:\\s*-?\\d+\\s*\\/\\s*-?\\d+)");
Matcher matcher = pattern.match(whatAreWeMatching);
String operator = matcher.group(1); // returns "-" with the example you gave

请注意,我还为空格\s*添加了大量检查,以便您可以在任何运算符之间自由放置空格。如果不检查空格,正则表达式看起来要小得多,但不会考虑像-21 / 12 + 14 / -5这样的东西。如果您确信您的输入只有您向我们展示的结构,您可以使用:

/(?:-?\d+\/-?\d+) ([*/+-]) (?:-?\d+\/-?\d+)/ig

(只需记住在将其放入字符串之前为所有反斜杠添加额外的反斜杠。)

答案 2 :(得分:0)

如果您始终输入此结构:- (IBAction)saveDocument:(id)sender,那么我只需在您的表达式中附加一个替换分支以获取该运算符:

values separated by single operators|(\S),如果您已经知道这些运营商应该是什么。

给出了:

|([+-*/])

DEMO

注意: OFC你应该相应地逃避代码中的slaches !!