关于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()
之间的区别,所以你的前两点并不像你所暗示的那样明显。