gpt4 book ai didi

java - 正则表达式分组和匹配

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:59 25 4
gpt4 key购买 nike

我有一个正则表达式https://regex101.com/r/PPbhRn/1 。在这里,我看到当捕获“and”时,我能够看到上面也捕获了一些空白。有什么办法可以去掉那些空白吗?我想知道只有在正确捕获分组时模式才会匹配?

String validRegex="(((?:[(]* ?[a-z][a-z]+ ?[)]*)|[(]* ?(NOT) (?:[(]* ?[a-z][a-z]+ ?[)]*) ?[)]*)( (AND|OR) ((?:[(]* ?[a-z][a-z]+ ?[)]*)|[(]* ?(NOT) (?:[(]* ?[a-z][a-z]+ ?[)]*) ?[)]*))*)";

String formula = "mean AND trip OR (mean OR mango) AND (mean AND orange) OR mango AND (test OR NOT help)";
Pattern p1 = Pattern.compile(validRegex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
final Matcher matcher = p1.matcher(formula);

boolean result=MarketMeasureUtil.isValidFormula(formula);
System.out.println(result);

while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
System.out.println( matcher.group() + "starting at" + "index" + matcher.start()+ "and ending at index" +matcher.end() );

}

我无法正确捕获这些组,我需要捕获诸如“mean AND trip”“OR”“mean or mango”等组。isValidFormula() 调用 regex.matches()。在我们的例子中,匹配效果很好。分组未按预期工作

最佳答案

正则表达式不适合此任务。我怀疑如果您可以添加任意数量的大括号,甚至可以验证表达式。

您必须编写一个解析器来构建树,使用如下类:

class Node {

boolean[] isAnd = null;
Node[] children = null;
String literal = null;

Node(String literal) { // creator for literals
this.literal = literal;
}

Node(boolean[] isAnd) { // creator for intermediate nodes
this.isAnd = isAnd;
children = new Node[isAnd.length + 1];
}

}

该方法如下所示:

Node parse(String) throws ParseException { // returns the root

首先可以通过计算所有大括号来删除左右两侧多余的大括号,然后找到 0 级 andor(即那些不在大括号中的)并创建一个中间节点,如果没有找到任何 0 级 andor 则该字符串必须是文字,否则它是无效的。如果它是中间节点,则通过使用 0 级 andor 周围的子字符串递归调用 parse 方法来添加子节点。

关于java - 正则表达式分组和匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40818513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com