【问题标题】:Java validate and split numbers and symbols using regexJava 使用正则表达式验证和拆分数字和符号
【发布时间】:2023-03-21 01:52:02
【问题描述】:

我正在尝试验证一个字符串,它必须具有正确顺序的特定模式,并进一步将它们分成组。

我的预期格式是 \60#######\60000000 其中

  1. 它只能以一个“\”开头
  2. 后跟一位或多位数字(60 为示例,可以是任意数字)
  3. 后跟零个或多个“#”
  4. 没有别的东西

可能的匹配是这样的

  1. \60000000000
  2. \60###
  3. \60############
  4. \58342##

所以我在下面编译了正则表达式来尝试验证,并进一步将其分成组(期望 2 组(不带 #)或 3 组(带 #)):

Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");

我正在尝试检测 1 x \,1 个或多个 0 到 9,任意数量的 #。

和单元测试:

private static void digest(String formatTxt) {
    System.out.println("Doing: " + formatTxt);
    Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");

    if (numPattern.matcher(formatTxt).find()) {
        System.out.println("Pattern matched!");
    }

    int i = 0;
    Matcher matcher = numPattern.matcher(formatTxt);

    while (matcher.find()) {
        i++;
        String data = matcher.group();
        System.out.println(i + ". " + data);
    }

    System.out.println("");
}

public static void main(String[] args) {
    digest("\\60000000000");
    digest("\\6000000000000");
    digest("\\60#########");
    digest("\\60############");
    digest("\\60############6");
    digest("\\60########A####");
    digest("\\lala60000000000");
    digest("\\60#####6######");
    digest("\\60#####6##A####");
}

结果:

// Doing: \60000000000
// Pattern matched!
// 1. \
// 2. 60000000000
// 3. 
// Comment: OK but not sure why is there third element
// 
// Doing: \6000000000000
// Pattern matched!
// 1. \
// 2. 6000000000000
// 3. 
// Comment: OK but not sure why is there third element
// 
// Doing: \60#########
// Pattern matched!
// 1. \
// 2. 60
// 3. #########
// 4. 
// Comment: OK but not sure why is there forth element
// 
// Doing: \60############
// Pattern matched!
// 1. \
// 2. 60
// 3. ############
// 4. 
// Comment: OK but not sure why is there forth element
// 
// Doing: \60############6
// Pattern matched!
// 1. \
// 2. 60
// 3. ############
// 4. 6
// 5. 
// Comment: Not OK because I do not want anything behind #
// 
// Doing: \60########A####
// Pattern matched!
// 1. \
// 2. 60
// 3. ########
// 4. 
// 5. ####
// 6. 
// Comment: Not OK because I do not want anything behind first group of #
// 
// Doing: \lala60000000000
// Pattern matched!
// 1. \
// 2. 
// 3. 
// 4. 
// 5. 
// 6. 60000000000
// 7. 
// Comment: Not OK because \\ must be followed by digits
// 
// Doing: \60#####6######
// Pattern matched!
// 1. \
// 2. 60
// 3. #####
// 4. 6
// 5. ######
// 6. 
// Comment: Not OK because I do not want anything behind first group of #
// 
// Doing: \60#####6##A####
// Pattern matched!
// 1. \
// 2. 60
// 3. #####
// 4. 6
// 5. ##
// 6. 
// 7. ####
// 8. 
// Comment: Not OK because I do not want anything behind first group of #

如果有人可以指导我,我需要在正则表达式中进行哪些更改,以便实现上述要求?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您可以使用以下正则表达式:

    ^(\\)(\d+)(#*)$
    

    regex demo

    在 Java 中,您可以使用 String rx = "(\\\\)(\\d+)(#*)"Matcher.matches

    详情

    • ^ - 字符串开头(隐含在 matches() 中)
    • (\\) - 第 1 组:单个反斜杠
    • (\d+) - 第 2 组:一位或多位数字
    • (#*) - 第 3 组:0+ # 字符
    • $ - 字符串结尾(隐含在 matches() 中)。

    固定Java demo code:

    private static void digest(String formatTxt) {
        System.out.println("Doing: " + formatTxt);
        Pattern numPattern = Pattern.compile("(\\\\)(\\d+)(#*)");
        Matcher m = numPattern.matcher(formatTxt);
        if (m.matches()) {
            System.out.println("Pattern matched!");
            System.out.println("1. " + m.group(1));
            System.out.println("2. " + m.group(2));
            System.out.println("3. " + m.group(3));
            System.out.println("");
        }
    }
    

    【讨论】:

    • 感谢@Wiktor,但我是否也应该在String rx 的末尾加上$ 符号?
    • @ChorWaiChun 请参阅我的demo 了解使用详情。对于matches(),不需要前导^ 和尾随$
    • 请注意:如果您在某种循环中使用正则表达式,请在 digest 方法之外定义它,并使用编译后的版本来初始化每个 Matcher
    • 哇,这正是我所需要的,非常感谢您的解释! =)
    • 但是有一个问题,总有第三组正常吗?
    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多