Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获除特定正则表达式之外的所有内容_Java_Regex - Fatal编程技术网

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

Java 捕获除特定正则表达式之外的所有内容,java,regex,Java,Regex,我在尝试实现一些正则表达式时遇到了一些问题。我需要捕捉所有东西,除了一个特定的操作员。这就是基本的格式: 分数算子分数 这是当前的正则表达式: ([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*) 现在,它正在捕获两个分数,但我需要它来获取运算符。例如,如果我输入: -12/43 - 3/-5 它将捕获-12/43和3/-5。我需要它来捕捉除此之外的一切;我需要它来捕捉中间的操作员。 我试着搜索了一段时间,但我得到了不同的答案,详细说明了如何做到这一点。任何

我在尝试实现一些正则表达式时遇到了一些问题。我需要捕捉所有东西,除了一个特定的操作员。这就是基本的格式:

分数算子分数

这是当前的正则表达式:

([ \t]*-?[0-9]+[ \t]*/[ \t]*-?[0-9]+[ \t]*)
现在,它正在捕获两个分数,但我需要它来获取运算符。例如,如果我输入:

-12/43 - 3/-5
它将捕获
-12/43
3/-5
。我需要它来捕捉除此之外的一切;我需要它来捕捉中间的操作员。


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

一个相当简单的方法就是用
”替换分数,然后剩下的就是运算符

Pattern fraction = Pattern.compile("\\s*-?\\d+\\s*/\\s*-?\\d+\\s*");
Matcher matcher = fraction.match(myExpression);
String operator = matcher.replaceAll("").trim();
运算符
变量现在是原始表达式,与分数模式匹配的所有子字符串都已删除

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


虽然这应该行得通,但我不推荐这种方法。假设你想对表达式做些什么(比如计算它),你最好使用合适的词汇和语义分析技术。有一些第三方库(例如)可以用最少的工作量和更大的灵活性完成这项工作。

尝试使用捕获组:

/(?:\s*-?\d+\s*\/\s*-?\d+)\s*([*/+-])\s*(?:\s*-?\d+\s*\/\s*-?\d+)/ig
我会解释这里发生了什么。我们有三个捕获组:两个是非捕获组
(?:*)
,一个是捕获组
(*)
。非捕获组包围着您忽略的分数,而捕获组包围着您要查找的运算符
[*/+-]
。现在,您可以通过以下方式获得操作员:

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

(在将其放入字符串之前,请记住在所有反斜杠中添加一个额外的反斜杠。)

如果您总是使用这种结构的输入:
值由单个运算符分隔,那么我只需在表达式中附加一个替代分支来获取该运算符:

|(\S)
|([+-*/])
如果您已经知道这些运算符应该是什么

其中:

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


注意:OFC您应该相应地在代码中转义slaches

您是否在考虑
^
?始终只有两个“值”由运算符分隔?如果不是,还有什么变化?在这种情况下使用
String.replaceAll
不是更好吗?@ScaryWombat个人偏好,但我倾向于将我的模式
静态
最终
与任何其他常量一样,而不是嵌入语句中。但你可能是对的,这会使答案变得简单一点。我尝试了你的方法,除了一个部分外,其他部分都有效。我试过这样的表达:1/2-1/2。它应该是1/2减去1/2,但取而代之的是1/2(负)1/2。这个“1/2-1/2”会起作用,但“1/2-1/2”不会。