我是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");
}
}
答案 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)
你的正则表达式完全正常。
问题来自于您在代码中交换了exp
和regExp
这一事实。函数compile
将正则表达式作为参数,而函数matcher
使表达式匹配。
答案 3 :(得分:4)
你的(编辑过的)正则表达式很好。
如果要解压缩123
,可以使用matcher.group(2)
。在 matches
或find
之后,该方法仅可以调用。 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);