有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于匹配特殊模式的java正则表达式

我正在尝试匹配如下字符串:62.00|LQ+2*2,FP,MD*3 "Description" 如果十进制值为2位可选数字,则每个用户都有两个字符,后面可以跟

(\+[\d]+)? or (\*[\d]+)? or none, or both, or both in different order

比如:

LQ*2+4 | LQ+4*2 | LQ*2 | LQ+8 | LQ

描述也是可选的

我尝试的是:

Pattern.compile("^(?<number>[\\d]+(\\.[\\d]{2})?)\\|(?<users>([A-Z]{2}){1}(((\\+[\\d]+)?(\\*[\\d]+)?)|((\\+[\\d]+)?(\\*[\\d]+)?))((,[A-Z]{2})(((\\+[\\d]+)?(\\*[\\d]+)?)|((\\+[\\d]+)?(\\*[\\d]+)?)))*)(\\s\\\"(?<message>.+)\\\")?$");

我需要得到所有的用户,这样我就可以用“,”来分割他们,然后用我的方式进一步正则化。但我不能从中得到任何东西。所需的输出来自

62.00|LQ+2*2,FP,MD*3 "Description"

应该是:

62.00

LQ+2*2,FP,MD*3

Description

接受的输入应为以下类型:

62.00|LQ+2*2,FP,MD*3

30|LQ "Burgers"

35.15|LQ*2,FP+2*4,MD*3+4 "Potatoes"

35.15|LQ,FP,MD


共 (2) 个答案

  1. # 1 楼答案

    与您描述的输入匹配的精确正则表达式应由该正则表达式实现

    ^(\d+(?:\.\d{1,2})?)\|([a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?(?:,[a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?)*)(?: +(.+))?$
    

    其中,group1将包含最多两位可选小数的数字,group2将包含您在文章中描述的逗号分隔输入,group3将包含可选描述(如果存在)

    正则表达式的解释:

    • ^-字符串的开头
    • (\d+(?:\.\d{1,2})?)-匹配小数后可以有两位可选数字的数字,并在group1中捕获该数字
    • \|-匹配输入中数字后面的文字|
    • ([a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?(?:,[a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?)*)-此部分匹配两个字母,后跟+后跟数字的任意组合,可选地将*后跟数字或*后跟数字,可选地将+后跟数字的任意组合,一次或全部都是可选的,并将其捕获到组2中
    • (?: +(.+))?-这与可选描述相匹配,并在group3中捕获它
    • $-标记输入结束

    Regex Demo

  2. # 2 楼答案

    我猜我们这里有几个可选组,这可能不是问题。我遇到的问题是,我不太确定我们的输入范围和期望的输出范围


    正则表达式1

    我猜,如果我们只是匹配所有内容,我们可能会从类似的内容开始:

    [0-9]+(\.[0-9]{2})?\|[A-Z]{2}[+*]?([0-9]+)?[+*]?([0-9]+)?,[A-Z]{2},[A-Z]{2}[+*]?([0-9]+)?(\s+"Description")?
    

    在这里,我们只需在每个子表达式之后添加一个?,然后使用字符列表和量词,并开始从左向右滑动所有内容,以覆盖所有输入

    如果我们喜欢捕获,那么我们只需用一个捕获组()包装我们想要捕获的任何部分

    Demo

    测试

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    final String regex = "[0-9]+(\\.[0-9]{2})?\\|[A-Z]{2}[+*]?([0-9]+)?[+*]?([0-9]+)?,[A-Z]{2},[A-Z]{2}[+*]?([0-9]+)?(\\s+\"Description\")?";
    final String string = "62.00|LQ+2*2,FP,MD*3 \"Description\"\n"
         + "62|LQ+2*2,FP,MD*3 \"Description\"\n"
         + "62|LQ+2*2,FP,MD*3\n"
         + "62|LQ*2,FP,MD*3\n"
         + "62|LQ+8,FP,MD*3\n"
         + "62|LQ,FP,MD";
    
    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    final Matcher matcher = pattern.matcher(string);
    
    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));
        }
    }
    

    正则表达式2

    如果我们希望输出列出的三组:

    ([0-9]+(\.[0-9]{2})?)\|([A-Z]{2}[+*]?([0-9]+)?[+*]?([0-9]+)?,[A-Z]{2},[A-Z]{2}[+*]?([0-9]+)?)(\s+"Description")?
    

    Demo 2

    测试

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    final String regex = "([0-9]+(\\.[0-9]{2})?)\\|([A-Z]{2}[+*]?([0-9]+)?[+*]?([0-9]+)?,[A-Z]{2},[A-Z]{2}[+*]?([0-9]+)?)(\\s+\"Description\")?";
    final String string = "62.00|LQ+2*2,FP,MD*3 \"Description\"\n"
         + "62|LQ+2*2,FP,MD*3 \"Description\"\n"
         + "62|LQ+2*2,FP,MD*3\n"
         + "62|LQ*2,FP,MD*3\n"
         + "62|LQ+8,FP,MD*3\n"
         + "62|LQ,FP,MD";
    final String subst = "\\1\\n\\3\\n\\7";
    
    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    final Matcher matcher = pattern.matcher(string);
    
    // The substituted value will be contained in the result variable
    final String result = matcher.replaceAll(subst);
    
    System.out.println("Substitution result: " + result);
    

    正则表达式3

    根据更新的所需输出,这可能会起作用:

    ([0-9]+(\.[0-9]{2})?)\|((?:[A-Z]{2}[+*]?([0-9]+)?[+*]?([0-9]+)?,?)(?:[A-Z]{2}[+*]?([0-9]+)?[*+]?([0-9]+)?,?[A-Z]{2}?[*+]?([0-9]+)?[+*]?([0-9]+)?)?)(\s+"(.+?)")?
    

    DEMO