我有一个这样的字符串:
" @Test(groups = {G1}, description = "adc, def")"
我想在Java中使用正则表达式提取“adc,def”(不带引号),我该怎么做?
如果你真的想使用正则表达式:
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]
其实你会得到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));
}
}
}