在Java中使用正则表达式贪婪地搜索字符串模式

在Java中使用正则表达式贪婪地搜索字符串模式,java,regex,pattern-matching,Java,Regex,Pattern Matching,我有一个用例,我想在给定字符串中的、=、和=之间搜索一个运算符,并将表达式分成两部分,即右表达式和左表达式,并在计算最终条件运算符之前分别计算它们 这可以从以下示例中理解: Pattern pattern1 = Pattern.compile("(.*?)(<|>|<=|=|>=)(.*)"); Matcher matcher2 = pattern1.matcher("4>=5"); while (matcher2.find()) { System.

我有一个用例,我想在给定字符串中的、=、和=之间搜索一个运算符,并将表达式分成两部分,即右表达式和左表达式,并在计算最终条件运算符之前分别计算它们

这可以从以下示例中理解:

Pattern pattern1 = Pattern.compile("(.*?)(<|>|<=|=|>=)(.*)");
Matcher matcher2 = pattern1.matcher("4>=5");
while (matcher2.find()) {
        System.out.println(matcher2.group(1) + ";" + matcher2.group(2)+ ";" + matcher2.group(3));
}
预期输出为
4;>=;5
但是=操作员被拆分,因为操作员单独存在


我想以贪婪的方式计算子句
(|=)
,以便
=
被视为一个单独的实体,如果它们同时出现,则被列出来。

您可以尝试简化为

 pattern1 = Pattern.compile("(.*?)(>=?|<=?|=)(.*)");
pattern1=Pattern.compile((.*)(>=?|
stringtestt=“4>=5”;

System.out.println(testt.replaceAll(“(*)”>=?|只需将它们按正确的顺序排列即可。。。(=|=|>|@RobertHanson-这是一个很好的答案。它很有效,但是如果我从一个列表中得到一个这些操作符的列表会怎么样。在这种情况下,我可能不确定顺序。我如何使它独立于顺序?@RobertHanson:你应该把它作为一个答案发布!@AbhishekJain-你可以先按长度排序。例如,Collections.sort(listOfOperators,lengthComparator),其中lengthComparator是已实现按长度排序的比较器实例。@RobertHanson-感谢您的建议,但我已经使用相同的技术实现了相同的功能。无论如何,感谢您发布此信息。:)+1很好的简化。但是这对
4=5
@shyam不起作用-如果我从未排序的数据结构中获取运算符列表,会怎么样?如果我不知道所有运算符,我可能无法表达相同的运算符。@AbhishekJain,那么你不应该使用正则表达式。如果你的运算符中有一个具有特殊字符,该怎么办作为正则表达式的意义?@RohitJain谢谢:)在我对其他答案所做的回答中,错过了所有这些PipesName注释中的
=
:如果我从未排序的数据结构中获取运算符列表,该怎么办?在不知道所有运算符的情况下,我可能无法表达相同的内容。那么为什么不生成(运算符1 |运算符2)字符串(运行时)然后将它附加到正则表达式?
“(.*?”+运算符+“(.*”)
这正是我想做的,但是1)我可能不确定运算符从未排序的数据结构中进入的顺序,因此,顺序很可能是,=,因此同样的问题。2)我想让它成为一个动态的东西,运营商之间可能没有相互关联。是的,甚至我也在考虑这个选项。让我试试。:)但这将是一个丑陋的实现。我们不能做一些更聪明的事情吗?
 pattern1 = Pattern.compile("(.*?)(>=?|<=?|=)(.*)");
String testt = "4>=5";
System.out.println(testt.replaceAll("(.*?)(>=?|<=?|=)(.*)", "$1;$2;$3"));