7

我是 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");
   }


}
4

8 回答 8

12

问题是:您不小心交换了使用正则表达式模式和要检查的表达式

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);
于 2013-03-19T09:46:42.063 回答
8

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

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

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

于 2013-03-19T09:47:54.000 回答
5

您的正则表达式非常好

问题来自您在代码中交换exp的事实。regExp该函数compile将正则表达式作为参数,而该函数matcher将表达式进行匹配。

于 2013-03-19T09:47:44.693 回答
4

您的(已编辑)正则表达式很好。

如果要提取123,可以使用matcher.group(2). 该方法只能在or之后 调用。返回第 n 个。捕获组是您的正则表达式的一部分,用括号括起来。返回匹配的字符串。matchesfindmatcher.group(n)capture groupmatcher.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
于 2013-03-19T10:04:43.287 回答
2

if(exp.matches(regExp))

仅此一项就足够了。除非您有其他需求,否则您不需要 Pattern/Matcher。

于 2013-03-19T09:47:25.437 回答
1

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

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

这将输出打印为:123

您的正则表达式非常好。

于 2013-03-19T10:07:04.433 回答
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));
    }
}
于 2013-03-19T10:10:50.280 回答
0

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

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);
于 2013-03-19T09:48:17.710 回答