关于Java正则表达式的问题

关于Java正则表达式的问题,java,regex,Java,Regex,我从数组列表中获取一个字符串: array.get(0).toString() 给出TITLE=“blabla” 我想要字符串blabla,所以我尝试这个: Pattern p = Pattern.compile("(\".*\")"); Matcher m = p.matcher(array.get(0).toString()); System.out.println("Title : " + m.group(0)); 它不起作用:java.lang.IllegalStateExcepti

我从数组列表中获取一个字符串:

array.get(0).toString()
给出TITLE=“blabla”

我想要字符串blabla,所以我尝试这个:

Pattern p = Pattern.compile("(\".*\")");
Matcher m = p.matcher(array.get(0).toString());
System.out.println("Title : " + m.group(0));
它不起作用:
java.lang.IllegalStateException:未找到匹配项

我还尝试:

Pattern p = Pattern.compile("\".*\"");
Pattern p = Pattern.compile("\".*\"");  
Pattern p = Pattern.compile("\\\".*\\\"");
在我的程序中没有匹配项,但所有模式都适用


有什么想法吗?提前感谢。

字符串中是否包含双引号(“)


所有正则表达式都已转义,仅当列表中的字符串包含双引号字符时才会匹配。

您需要首先在Matcher实例上调用
find()
matches()
:它们实际执行正则表达式并返回是否匹配。然后,只有在匹配的情况下,才可以调用方法来获得匹配组。

几点:

国家的Javadoc:

IllegalStateException-如果尚未尝试匹配,或者如果先前的匹配操作失败

也就是说,在使用group之前,必须首先使用
m.matches
(匹配整个序列)或
m.find
(匹配子序列)

其次,您实际上需要
m.group(1)
,因为
m.group(0)
是整个模式

实际上,这在这里并不重要,因为所讨论的regexp以捕获括号开始和结束,因此组(0)与组(1)是相同的字符串,但如果您的regexp看起来像:
“TITLE=(\”*”)

示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

@SuppressWarnings("serial")
public class MatcherTest {

    @Test(expected = IllegalStateException.class)
    public void testIllegalState() {
        List<String> array = new ArrayList<String>() {{ add("Title: \"blah\""); }};
        Pattern p = Pattern.compile("(\".*\")");
        Matcher m = p.matcher(array.get(0).toString());
        System.out.println("Title : " + m.group(0));
    }

    @Test
    public void testLegal() {
        List<String> array = new ArrayList<String>() {{ add("Title: \"blah\""); }};
        Pattern p = Pattern.compile("(\".*\")");
        Matcher m = p.matcher(array.get(0).toString());
        if (m.find()) {
            System.out.println("Title : " + m.group(1));
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.junit.Test;
@抑制警告(“串行”)
公共类匹配测试{
@测试(预期=IllegalStateException.class)
公共无效测试状态(){
List array=new ArrayList(){{add(“Title:\“blah\”);};
模式p=Pattern.compile(“(\”*\”);
Matcher m=p.Matcher(array.get(0.toString());
System.out.println(“标题:+m.group(0));
}
@试验
公共法律{
List array=new ArrayList(){{add(“Title:\“blah\”);};
模式p=Pattern.compile(“(\”*\”);
Matcher m=p.Matcher(array.get(0.toString());
if(m.find()){
System.out.println(“标题:+m.group(1));
}
}
}

在本例中,您要调用的是find()。没错。因为这是一个可疑的猜测,如果你已经编译了一个模式,并且为一个给定的字符串做了一个“匹配器”,你仍然想在这个字符串中找到任何东西。(如果你只想知道某个东西是否与模式匹配,我不明白你为什么需要匹配器,而且模式本身不能告诉你。)通过冗长来拯救世界……如果你想要更短的代码,你可以简单地编写pattern.matches(“regex”,input)。如果您想要为几个匹配只编译一次模式,那么您需要做更多的工作,是的。您似乎在抱怨没有pattern.matches(CharSequence)便利实例方法。毕竟,您可能会多次调用matcher.find()来查找多个匹配项,这与执行matcher.matches()或matcher.lookingAt()有很大不同。“您的regexp必须匹配整个字符串”——这就是
matches()
find()
之间的区别,所以你的前两点并不像你所暗示的那样明显。