【问题标题】:Finding substring in RegEx Java在 RegEx Java 中查找子字符串
【发布时间】:2012-12-25 01:31:32
【问题描述】:

您好,我有一个关于 RegEx 的问题。我目前正在尝试找到一种方法来获取任何字母的子字符串,后跟任何两个数字,例如:d09。

我想出了 RegEx ^[a-z]{1}[0-9]{2}$ 并在字符串上运行它

sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0

但是,它永远找不到 r30,下面的代码显示了我在 Java 中的方法。

Pattern pattern = Pattern.compile("^[a-z]{1}[0-9]{2}$");
Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");

if(matcher.matches())
    System.out.println(matcher.group(1));

它永远不会打印出任何东西,因为匹配器永远不会找到子字符串(当我通过调试器运行它时),我做错了什么?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    有三个错误:

    1. 您的表达式包含anchors^ 只匹配字符串的开头,$ 只匹配结尾。所以你的正则表达式将匹配"r30",但不匹配"foo_r30_bar"。您正在搜索子字符串,因此您应该删除锚点。

    2. matches 应该是find

    3. 您没有组 1,因为您的正则表达式中没有括号。使用group() 而不是group(1)

    试试这个:

    Pattern pattern = Pattern.compile("[a-z][0-9]{2}");
    Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");
    
    if(matcher.find()) {
        System.out.println(matcher.group());    
    }
    

    ideone


    Matcher Documentation

    通过调用模式的 matcher 方法从模式创建匹配器。创建后,匹配器可用于执行三种不同类型的匹配操作:

    • matches 方法尝试将整个输入序列与模式进行匹配。
    • lookingAt 方法尝试从开头开始匹配输入序列与模式。
    • find 方法扫描输入序列,寻找与该模式匹配的下一个子序列。

    【讨论】:

    • 工作就像一个魅力。谢谢你,我真的很感激!
    【解决方案2】:

    它不匹配,因为^$ 分隔了字符串的开头和结尾。如果您希望它在任何地方,请将其删除,您将成功。

    【讨论】:

      【解决方案3】:
      1. 您的正则表达式已锚定,因此除非整个输入与您的正则表达式匹配,否则它将永远不会匹配。使用[a-z][0-9]{2}

      2. 不要使用.matches(),但.find().matches() 是可耻的错误命名,并试图匹配整个输入。

      【讨论】:

        【解决方案4】:

        "[a-z][0-9][0-9]" 怎么样?这应该会找到您正在寻找的所有子字符串。

        【讨论】:

          【解决方案5】:

          ^[a-z]{1}[0-9]{2}$

          sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0

          据我所知

          • 找到第一个较低的 gives[s] 大写字母,它后面应该有两个数字,这意味着你的字符串的长度是并且永远是 3 个单词字符

          如果我有更多关于你的字符串的数据,我可以提供帮助

          编辑

          如果你确定*点数那么

          改变这一行

          Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0");
          

          Matcher matcher = pattern.matcher("sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0".split("\.")[0]);
          

          注意:-

          使用我的解决方案,您应该省略模式的前导 ^

          阅读此页面Spliting strings

          【讨论】:

            猜你喜欢
            • 2012-01-25
            • 1970-01-01
            • 2017-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-18
            • 2020-05-15
            • 1970-01-01
            相关资源
            最近更新 更多