2012-12-25 95 views
1

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

我想出了正则表达式^[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)); 

它永远不会打印出任何东西,因为匹配从来没有发现子(当我通过调试器中运行),我究竟做错了什么?

回答

6

有三个错误:

  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

    甲匹配从图案创建:

尝试此。匹配器一旦创建,可用于执行三种不同类型的匹配操作:

  • matches方法尝试将整个输入序列与模式进行匹配。
  • lookAt方法尝试将输入序列与开始的模式匹配。
  • find方法扫描输入序列,查找与模式匹配的下一个子序列。
+0

工作就像一个魅力。谢谢,我真的很感激! – HerrPfister

2

它不匹配,因为^$ delimite开始和字符串的结尾。如果你想要它在任何地方,删除它,你会成功。

1
  1. 你的正则表达式是锚定的,因为它永远不会匹配,除非整个输入匹配你的正则表达式。使用[a-z][0-9]{2}

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

0

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

0

^[AZ] {1} [0-9] {2} $

sedfdhajkldsfakdsakvsdfasdfr30.reed.op.1xp0

据我可以阅读这个

  • 找到第一个下一个给出 [s]后盖字母应该有两个数字,意思是你的字符串的长度是,而且总是会是3个字的字符

也许,如果我对你的字符串更多的数据,我可以帮助

编辑

如果您确定*然后点数

改变这一行的

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

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

注: -

使用我的解决方案应忽略的领先^用于模式

阅读此页为Spliting strings