我在尝试实现一些正则表达式时遇到了一些麻烦。我需要捕获除一个特定运算符之外的所有内容所以这就是格式:
分数运算符分数
这是当前的正则表达式:
([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*)
现在,它捕获了两个分数,但我需要它才能获得操作员。例如,如果我输入:
-12/43 - 3/-5
它会捕获-12/43
和3/-5
。我需要它来捕捉除了那之外的一切;我需要它来捕捉中间的操作员。
我已经尝试了一段时间,但我得到了不同的答案,详细说明了如何做到这一点。任何帮助将不胜感激!
答案 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)
,如果您已经知道这些运营商应该是什么。
给出了:
|([+-*/])
注意: OFC你应该相应地逃避代码中的slaches !!