8

我有一个这样的字符串:

"   @Test(groups = {G1}, description = "adc, def")"

我想在Java中使用正则表达式提取“adc,def”(不带引号),我该怎么做?

4

2 回答 2

16

如果你真的想使用正则表达式:

Pattern p = Pattern.compile(".*\\\"(.*)\\\".*");
Matcher m = p.matcher("your \"string\" here");
System.out.println(m.group(1));

解释:

.*   - anything
\\\" - quote (escaped)
(.*) - anything (captured)
\\\" - another quote
.*   - anything

但是,不使用正则表达式要容易得多:

"your \"string\" here".split("\"")[1]
于 2013-01-29T02:31:22.267 回答
3

其实你会得到IllegalStateException

public class RegexDemo {
    public static void main(String[] args) {
        Pattern p = Pattern.compile(".*\\\"(.*)\\\".*");
        Matcher m = p.matcher("your \"string\" here");
        System.out.println(m.group(1));
    }
}

它给:

Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at RegexDemo.main(RegexDemo.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

使用前group(),您需要调用find()matches()

简单测试,例如:

public class RegexTest {
    @Test(expected = IllegalStateException.class)
    public void testIllegalState() {
        String string = new String("your \"string\" here");
        Pattern pattern = Pattern.compile(".*\\\"(.*)\\\".*");
        Matcher matcher = pattern.matcher(string);

        System.out.println(matcher.group(1));
    }

    @Test
    public void testLegalState() {
        String string = new String("your \"string\" here");
        Pattern pattern = Pattern.compile(".*\\\"(.*)\\\".*");
        Matcher matcher = pattern.matcher(string);

        if(matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}
于 2015-09-24T10:24:26.390 回答