【问题标题】:Greedy search for string patterns using regular expressions in Java在 Java 中使用正则表达式贪婪搜索字符串模式
【发布时间】:2012-10-26 20:24:52
【问题描述】:

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

这可以从下面的例子中理解:

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

预期的输出是 4;&gt;=;5,但 &gt;= 运算符被拆分,因为运算符 &gt; 独立存在。

我想以贪婪的方式评估子句 (&lt;|&gt;|&lt;=|=|&gt;=),以便 &gt;= 被视为一个实体,如果它们一起出现,则会被列出。

【问题讨论】:

  • 只要把它们按正确的顺序排列... (=|=|>|
  • @RobertHanson - 这很好。它有效,但是如果我从列表中获取这些运算符的列表怎么办。在那种情况下,我可能不确定顺序。如何使其独立于订单?
  • @RobertHanson:您应该将其发布为答案!
  • @AbhishekJain - 您可以先按长度对它们进行排序。例如。 Collections.sort(listOfOperators, lengthComparator),其中 lengthComparator 是 Comparator 的一个实例,已实现按长度排序。
  • @RobertHanson - 感谢您的建议,但我已经使用相同的技术实现了相同的功能。不管怎样,谢谢你发布这个。 :)

标签: java regex pattern-matching


【解决方案1】:

你可以尝试简化为

 pattern1 = Pattern.compile("(.*?)(>=?|<=?|=)(.*)");

【讨论】:

  • +1 相当简单。但这不适用于4=5
  • @shyam - 如果我从未排序的数据结构中获取运算符列表怎么办。如果不知道所有运算符,我可能无法表达相同的意思。
  • @AbhishekJain 那么你不应该使用正则表达式。如果您的某个运算符具有作为正则表达式具有特殊含义的字符怎么办?
  • @RohitJain 谢谢 :) 错过了所有这些管道中的 =
【解决方案2】:
String testt = "4>=5";
System.out.println(testt.replaceAll("(.*?)(>=?|<=?|=)(.*)", "$1;$2;$3"));

易于理解,您将立即更换所有内容。你犯了一个错误,如果它在它之前找到一个 = 放在第一位。

【讨论】:

  • 与我对其他答案的评论相同:如果我从未排序的数据结构中获取运算符列表怎么办。如果不知道所有运算符,我可能无法表达相同的意思。
  • 那么为什么不创建一个 (operator1|operator2) 字符串(运行时),然后将其附加到正则表达式? "(.*?)"+operators+"(.*)"
  • 正是我想要做的,但是 1) 我可能不确定运算符从未排序的数据结构中进入的顺序,所以,顺序很可能是 ,= 因此同样的问题。 2)我想让它成为一个动态的东西,运营商可能不相互关联。
  • 是的,即使我也在考虑这个选项。让我试一试。 :)
  • 但这将是一个丑陋的实现。我们不能做点更聪明的事吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多