正则表达式仅匹配字母和数字

Pil*_*cia 6 java regex

你能帮忙处理这段代码吗?

看似简单,却总是失败。

@Test
public void normalizeString(){
    StringBuilder ret =  new StringBuilder();
    //Matcher matches = Pattern.compile( "([A-Z0-9])" ).matcher("P-12345678-P");
    Matcher matches = Pattern.compile( "([\\w])" ).matcher("P-12345678-P");
    for (int i = 1; i < matches.groupCount(); i++)
        ret.append(matches.group(i));

    assertEquals("P12345678P", ret.toString());
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 8

构造 aMatcher不会自动执行任何匹配。这部分是因为Matcher支持两种不同的匹配行为,不同之处在于匹配是否隐式锚定到 s 区域的开头Matcher。看来你可以达到你想要的结果,如下所示:

@Test
public void normalizeString(){
    StringBuilder ret =  new StringBuilder();
    Matcher matches = Pattern.compile( "[A-Z0-9]+" ).matcher("P-12345678-P");

    while (matches.find()) {
        ret.append(matches.group());
    }

    assertEquals("P12345678P", ret.toString());
}
Run Code Online (Sandbox Code Playgroud)

特别注意 的调用Matcher.find(),这是您的版本中的一个关键遗漏。此外,空值Matcher.group()返回与最后一个匹配的子字符串find()

此外,虽然您的使用Matcher.groupCount()并不完全错误,但它确实让我怀疑您对它的作用有错误的想法。特别是,在你的代码中它总是会返回1——它询问模式,而不是与之匹配的内容。