正则表达式不匹配数据,但正则表达式确认工作



我有下面的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>

和我在上面测试的网站。

  • regexerV1
  • regexpal

使用以下数据

                    <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();
    }
}

您将需要使用Matcher#find()而不是Matcher#matches()find()在给定字符串中搜索匹配项,而matches()尝试匹配整个字符串。你的正则表达式不匹配整个字符串

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();
        }
    }

我相信Sotirios是正确的,但是作为一种替代方法,在这种情况下,我更喜欢单行解决方案涉及笨拙的Matcher api,而是使用replaceAll():

String dateTime = input.replaceAll(".*(?:<span id="lblMatchTime" style="padding: 0px;">([\d+/ GMT:]+)</span>)?.*", "$1");

这是通过将".*"添加到模式的两端来实现的,因此整个输入都是匹配的,然后在组1的替换中使用反向引用$1将其替换为捕获的目标。在可选的非捕获组中添加了整个表达式的regex特殊酱,以便在没有匹配时使结果为空。

这避免了几行代码,并绕过了匹配与否的测试。

最新更新