【问题标题】:Java regex to match string and sub-string separately [duplicate]Java正则表达式分别匹配字符串和子字符串[重复]
【发布时间】:2018-01-10 12:16:05
【问题描述】:

下面是一个更大的场景的一部分,我正在尝试编写一个表达式来识别左操作数和后续运算符。

代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExTest1 {

    public static void main (String args[] ) {

        String input[] = { "namein", 
                        "namenotin"};

        String operatorExpr = "(?<operator>(in)|(notin))";
        String conditionExpr ="(?<operand1>\\S+)"+  operatorExpr;

        Pattern p = Pattern.compile(conditionExpr);

        for(String in: input) {

            Matcher m = p.matcher(in);
            if (m.find()) {

                String operand1 = m.group("operand1");
                String operator = m.group("operator");
                System.out.println("Input: \""+in + "\" | Operand1 : \""+ operand1 + "\"" + "| Operator : \""+ operator + "\"");

            }
        }

    }

}

实际输出:

Input: "namein" | Operand1 : "name"| Operator : "in"
Input: "namenotin" | Operand1 : "namenot"| Operator : "in"

预期输出:

Input: "namein" | Operand1 : "name"| Operator : "in"
Input: "namenotin" | Operand1 : "name"| Operator : "notin"

当我们有一个字符串和子字符串都与 or '|' 匹配时,我在这里写的表达式没有返回预期的输出量词

“in|notin”

一旦我确定两个匹配组相互排斥,如“ein|notin”,就会返回预期值。

但要求是使其也适用于当前场景。

【问题讨论】:

  • \S+ 贪婪地匹配整个字符串,然后回溯直到匹配innotin。让它变得懒惰 -> \S+?
  • @SebastianProske 它有效..谢谢!您能否用“?”为回溯机制添加更多细节?

标签: java regex regex-group


【解决方案1】:

尝试关注

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExTest1 {

    public static void main (String args[] ) {

        String input[] = { "namein", "namenotin"};

        String operatorExpr = "(?<operator>(in)|(notin))";
        String conditionExpr ="(?<operand1>\\S+?)"+  operatorExpr;

        Pattern p = Pattern.compile(conditionExpr);

        for(String in: input) {

            Matcher m = p.matcher(in);
            if (m.find()) {

                String operand1 = m.group("operand1");
                String operator = m.group("operator");
                System.out.println("Input: \""+in + "\" | Operand1 : \""+ operand1 + "\"" + "| Operator : \""+ operator + "\"");

            }
        }

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2017-11-09
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多