RegExp混乱

时间:2013-03-19 09:45:16

标签: java regex

我是Java表达正则表达式的新手。

有人可以告诉我正确的正则表达式,我应该用于下面的字符串 -

String exp = "ABCD_123_abc".

以及我用于上述字符串的正则表达式是:

regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"

但以下代码的输出为"**No Match Found**"

Public static void main()
{
   String exp = "ABCD_123_abc";
   String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";
   Pattern pattern = Pattern.compile(exp);
   Matcher matcher = pattern.matcher(regExp);
   if(matcher.matches())
   {
     System.out.println("Match found");
   }
   else
   {
     System.out.println(" NO Match found");
   }


}

8 个答案:

答案 0 :(得分:12)

问题是:你不小心交换了使用regexp模式和表达式来检查

String exp = "ABCD_123_abc";
String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";

应该使用

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);

Pattern.compile(String regex)函数接受正则表达式。

修改

我道歉,我的第一个解决方案确实是永远不会从未永远完成的事情:变量的名称与其价值的含义相矛盾。 ......这意味着痛苦和眼泪,并被愤怒的同事击中,同时被大喊大叫。对于犯罪 ......

,没有有效的辩护理由

<强> EDIT2 您可以通过Matcher.group(int)函数获取各个匹配的组:

String matchedStringpart matcher.group(2);

注意:我使用2作为参数:

  • 0表示匹配的输入序列
  • 1表示第一组(本例中为ABC
  • ......等等

如果您只需要123部分,我会为了清晰起见重写正则表达式:

regExp = "[a-zA-Z]+_([0-9]+)_[a-z]+";

但是,在这种情况下,必须使用group()调用1,因为现在第一个(也是唯一的)匹配组是第一个:

String matchedStringpart matcher.group(1);

答案 1 :(得分:8)

你没有编译正则表达式。你需要

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);

即。上面的代码混淆了正则表达式和输入字符串。但是,你的实际正则表达式是正确的。

答案 2 :(得分:5)

你的正则表达式完全正常

问题来自于您在代码中交换了expregExp这一事实。函数compile将正则表达式作为参数,而函数matcher使表达式匹配。

答案 3 :(得分:4)

你的(编辑过的)正则表达式很好。

如果要解压缩123,可以使用matcher.group(2)。在 matchesfind之后,该方法可以调用matcher.group(n)返回第n个capture group。捕获组是正则表达式的一部分,括在括号中。 matcher.group(0)返回匹配的字符串。

实施例

if(matcher.matches()) {
  System.out.println(matcher.group(0));
  System.out.println(matcher.group(1));
  System.out.println(matcher.group(2));
  System.out.println(matcher.group(3));
}

打印

 ABCD_123_abc
 ABCD
 123
 abc

答案 4 :(得分:2)

if(exp.matches(regExp))

仅此一点就足够了。除非你有其他需要,否则你不需要模式/匹配器。

答案 5 :(得分:1)

在这种情况下,如果要检索123,请使用以下代码:

 System.out.println(matcher.group(2));

这会将输出打印为: 123

你的正则表达式非常好。

答案 6 :(得分:1)

此模式将起作用 - 它匹配任意数量的大写或小写字母,然后是下划线,然后是任意数量的数字,然后是下划线,然后是任意数量的大写或小写字母。如果您想更具体一点,可以使用{n}而不是+来匹配特定数量的字符。

public static void main(String[] args) {
    final String myString = "ABCD_123_abc";
    final Pattern p = Pattern.compile("^[A-Za-z]++_(\\d++)_[A-Za-z]++$");
    final Matcher matcher = p.matcher(myString);
    if (matcher.matches()) {
        System.out.println(matcher.group(1));
    }
}

答案 7 :(得分:0)

首先编译正则表达式,然后使用matcher进行比较..

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);