关于Java正则表达式的问题

时间:2009-04-22 11:49:15

标签: 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.IllegalStateException: No match found

我也试试:

Pattern p = Pattern.compile("\".*\"");
Pattern p = Pattern.compile("\".*\"");  
Pattern p = Pattern.compile("\\\".*\\\"");

我的程序中没有任何内容匹配,但所有模式都适用于http://www.fileformat.info/tool/regex.htm

任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:8)

有几点:

Matcher#group州的Javadoc:

  

IllegalStateException - 如果尚未尝试匹配,或者上一次匹配操作失败

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

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

实际上,这不是很重要,因为有问题的正则表达式以捕获括号开头和结尾,因此group(0)与group(1)是相同的字符串,但是如果你的正则表达式看起来像是重要的:"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));
        }
    }
}

答案 1 :(得分:6)

您需要首先在Matcher实例上调用find()matches():这些实际执行正则表达式并返回它是否匹配。然后,只有匹配时,您才能调用方法来获取匹配组。

答案 2 :(得分:0)

你在字符串中包含双引号(“)吗?

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