-1

我想在 JAVA 中使用 Regex 将以下字符串拆分为一个数组,但我不知道该怎么做。

string1="advmod(likes-4, also-3)"  ==>    advmod, likes, also
string2="nsubj(likes-4, dog24-2)"  ==>    bsubj, likes, dog24
string3="num(dog24-3, 8-2)"        ==>    num, dog24, 8

请帮我做这项工作?如何将字符串如"num(dog24-3, 8-2)"拆分为三个标记numdog248,然后将它们放入字符串数组。

非常感谢。

4

4 回答 4

2

这是通用的:

String string[] = {"advmod(likes-4, also-3)",// ==> advmod , likes , also
        "nsubj(likes-4, dog24-2)",// ==> bsubj , likes , dog24
        "num(dog24-3, 8-2)"};//==> num ,dog24 , 8
Pattern p = Pattern.compile("(\\w+)\\(([^-]+).*, ([^-]+)");
for (int i = 0; i < string.length; i++) {
    Matcher m = p.matcher(string[i]);
    while(m.find()) {
        System.out.print(i+": ");
        for(int j=1; j<= m.groupCount(); j++){
            System.out.print(m.group(j));
            if(j!=m.groupCount()) {
                System.out.print(", ");
            }
        }
        System.out.println("");
    }
}

希望这会有所帮助,它对我有用。

这是输出:

0: advmod, likes, also
1: nsubj, likes, dog24
2: num, dog24, 8
于 2013-09-15T14:12:49.567 回答
1

对于第三串

  String re1="(num)";   // Word 1
    String re2=".*?";   // Non-greedy match on filler
    String re3="(dog24)";   // Alphanum 1
    String re4=".*?";   // Non-greedy match on filler
    String re5="(8)";   // Integer Number 1

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String word1=m.group(1);
        String alphanum1=m.group(2);
        String int1=m.group(3);
        System.out.print("("+word1.toString()+")"+"("+alphanum1.toString()+")"+"("+int1.toString()+")"+"\n");
    }
于 2013-09-15T14:08:55.703 回答
1

如果你想拆分,你可以使用这个:

str.split("\\(|-[0-9]+(?:,\\s+|\\))");

ideone 演示

于 2013-09-15T14:22:05.193 回答
0

您确实没有描述您的语法,但假设它看起来像 Java 方法或 Prolog 语句,请尝试

final static String TOKEN_CHARACTERS="[\w\d-]"
final Pattern p = Pattern.compile("^(" + TOKEN_CHARACTERS + "+)\((" + TOKEN_CHARACTERS + "+,\s*(" + TOKEN_CHARACTERS + ")\)$";

然后在-; 我认为出于某种原因它确实存在,并且不清楚它是否总是存在(如果是这样,您可以更改模式以对单曲进行硬编码,-而不是将其视为令牌的一部分)。如果您允许额外的空间等,请进行相应调整。

于 2013-09-15T14:13:50.253 回答