我有以下Java程序,它抓取日期时间字符串,并在多个正则表达式测试站点中进行测试,以检查它们是否确实有效,这是他们所做的。
private static final Pattern MATCH_DATE_TIME = Pattern.compile("<span id=\"lblMatchTime\" style=\"padding: 0px;\">([\\d+/ GMT:]+)</span>");
未转义的表达式
<span id="lblMatchTime" style="padding: 0px;">([\d/ :GMT]+)</span>
以及我在上面测试的网站。
使用以下数据
<div style="width: 30%; text-align: center; display: inline-block;"> <span> Time : </span> <span id="lblMatchTime" style="padding: 0px;">05/28/2014 14:16:21 GMT</span> </div> <div style="width: 30%; text-align: center; display: inline-block;"> <span>duration: </span> <span id="lblMatchDuration" style="padding: 0px;">50</span> <span> minutes </span> </div> </div>
以上两个未转义版本的网站都正确匹配下面的预期数据
<span id="lblMatchTime" style="padding: 0px;">05/28/2014 14:16:21 GMT</span> //the matched data
05/28/2014 14:16:21 GMT //$1 extracted data
虽然上述两个网站都成功匹配并提取了我的程序没有的数据。
这是我的程序代码(最小代码示例)
private static final Pattern MATCH_DATE_TIME = Pattern.compile("<span id=\"lblMatchTime\" style=\"padding: 0px;\">([\\d+/ GMT:]+)</span>");
public static void main(String[] args)
{
try
{
String data = JOptionPane.showInputDialog(null, "Please Enter The Match ID", "Grab Match Details", JOptionPane.PLAIN_MESSAGE);
Matcher m = MATCH_DATE_TIME.matcher(data);
System.out.println(m.matches());
String dateTime = m.group(0);
System.out.println(dateTime);
}
catch (IllegalStateException ise)
{
ise.printStackTrace();
}
}
答案 0 :(得分:5)
您需要使用Matcher#find()
代替Matcher#matches()
。 find()
在给定字符串中搜索匹配项,matches()
尝试匹配整个字符串。你的正则表达式与整个字符串不匹配。
答案 1 :(得分:0)
private static final Pattern MATCH_DATE_TIME = Pattern.compile("<span id=\"lblMatchTime\" style=\"padding: 0px;\">([\\d+/ GMT:]+)</span>");
public static void test()
{
try
{
String data = JOptionPane.showInputDialog(null, "Please Enter The Match ID", "Grab Match Details", JOptionPane.PLAIN_MESSAGE);
Matcher m = MATCH_DATE_TIME.matcher(data);
if(m.find())
{
System.out.println(m.group(1));
}
}
catch (IllegalStateException ise)
{
ise.printStackTrace();
}
}
答案 2 :(得分:0)
我相信Sotirios是正确的,但是作为替代方案,在这种情况下,我更喜欢单行解决方案而不是涉及笨拙的Matcher
api,但使用replaceAll()
代替:
String dateTime = input.replaceAll(".*(?:<span id=\"lblMatchTime\" style=\"padding: 0px;\">([\\d+/ GMT:]+)</span>)?.*", "$1");
这可以通过在模式的任一端添加".*"
以使整个输入匹配,然后使用替换为组1中的反向引用$1
将其替换为捕获的目标。 #39;添加了包含在可选非捕获组中的整个表达式的正则表达式特殊酱,如果没有匹配则将结果留空。
这避免了几行代码,并绕过了匹配与否的测试。