在Java中使用正则表达式在双引号之间提取子字符串

时间:2013-01-29 02:28:05

标签: java regex

我有一个这样的字符串:

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

我想在Java中使用regexp提取“adc,def”(不带引号),我该怎么办?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

实际上你会得到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));
        }
    }
}