[正则表达式] - 在方括号内的单词

3
String linkPattern = "\\[[A-Za-z_0-9]+\\]";  
String text = "[build]/directory/[something]/[build]/";   
RegExp reg = RegExp.compile(linkPattern,"g");  
MatchResult matchResult = reg.exec(text);  
for (int i = 0; i < matchResult.getGroupCount(); i++) {  
    System.out.println("group" + i + "=" + matchResult.getGroup(i));  
} 

我正在尝试获取由方括号包裹的所有块,形成路径字符串: 但我只得到了group0="[build]",我想要的是: 1:“[build]”2:“[something]”3:“[build]”
编辑: 只是为了清晰起见,括号内的单词是用随机文本生成的。
public static String genText()
{
    final int LENGTH = (int)(Math.random()*12)+4;

    StringBuffer sb = new StringBuffer();
    for (int x = 0; x < LENGTH; x++)
    {
        sb.append((char)((int)(Math.random() * 26) + 97));
    }
    String str = sb.toString();
    str = str.substring(0,1).toUpperCase() + str.substring(1);
    return str;
}

编辑 2: JDK工作正常,GWT RegExp出现了问题

已解决: Didier L的答案

String linkPattern = "\\[[A-Za-z_0-9]+\\]";
    String result = "";
String text = "[build]/directory/[something]/[build]/";
RegExp reg = RegExp.compile(linkPattern,"g");
MatchResult matchResult = null;
while((matchResult=reg.exec(text)) != null){
    if(matchResult.getGroupCount()==1) 
        System.out.println( matchResult.getGroup(0));
}
2个回答

2

我不知道你使用的是哪个正则表达式库,但如果使用JDK自带的库,代码应该如下:

String linkPattern = "\\[[A-Za-z_0-9]+\\]";
String text = "[build]/directory/[something]/[build]/";
Pattern pat = Pattern.compile(linkPattern);
Matcher mat = pat.matcher(text);
while (mat.find()) {
    System.out.println(mat.group());
}

输出:

[build]
[something]
[build]

JDK运行正常...已经检查过了,我遇到的问题是来自GWT的RegExp。 - Darwly
好的,我从未使用过它,但查看 API,难道您不应该在循环中调用 exec 直到它返回 null 吗?因为它是全局的 RegExp,它将使用最后一个索引来确定从哪里开始。 - Didier L
非常感谢,是我对 RegExp 的错误使用... 我会编辑主要问题。 - Darwly

1

尝试:

String linkPattern = "(\\[[A-Za-z_0-9]+\\])*";

编辑:

第二次尝试:

String linkPattern = "\\[(\\w+)\\]+"

第三次尝试,查看http://rubular.com/r/eyAQ3Vg68N


1
答案:group0=[build] group1=[build] .. 仍然缺少 [something] - Darwly
我怀疑你所说的“something”并不是你真正程序中的“something”,而是你为了不在这里发布而更改为“something”的一些文本。确保真实文本与块内容的正则表达式匹配,即它可以被[A-Za-z_0-9]+匹配。 - f1sh
现在我正在测试这段程序相关的内容,大部分都是随机生成的虚拟文本。我认为[dfakjth]不可读,所以我将其更改为[something]。但在生产环境中,我需要[fraction]作为示例。我已经编辑了帖子,你可以检查一下。 - Darwly
对于第二次尝试:group0=[build] group1=build - Darwly
1
Rublar运行良好,我认为RegExp有一些问题...也许我没有正确使用什么..我会再次检查,但非常感谢。 - Darwly
好的,但很奇怪的是,当我尝试使用rubular进行调试时,我遇到了一些类似的问题。在那里尝试您的原始正则表达式,您会得到几乎相同的错误。 - Rekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接