【问题标题】:Regex - Java - migrate a JS regex pattern to input of Java Pattern classRegex - Java - 将 JS 正则表达式模式迁移到 Java Pattern 类的输入
【发布时间】:2017-04-10 10:45:21
【问题描述】:

我在 Javascript 中使用了以下正则表达式模式:

模式-

/\<span\>(\d{2}-\d{2}-\d{4})\s*?(\d{1,2}:\d{2}\s*?(?:am|pm))\s*?(?:<\/SPAN><BR\/?><SPAN>)?\s*?((\d[ -]*?){13,17})\s*?\<\/span\>/i 

字符串 -

<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>

但是在将相同的模式字符串传递给 Pattern.compile() 函数时出现错误。

错误是:无效的转义序列。

这是我尝试过的:

Pattern p = Pattern.compile("/\<span\>(\d{2}-\d{2}-\d{4})\s*?(\d{1,2}:\d{2}\s*?(?:am|pm))\s*?(?:<\/SPAN><BR\/?><SPAN>)?\s*?((\d[ -]*?){13,17})\s*?\<\/span\>/i ");  

Matcher m = p.matcher("<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>");
boolean b = m.matches();

请建议我如何纠正这个问题。

谢谢

编辑

知道cmets后我将代码更改为following,但现在我无法匹配模式:

Pattern p = Pattern.compile(
        "(?i)/\\<span\\>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?\\<\\/span\\>");

Matcher m = p.matcher("<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>");
boolean b = m.matches();

System.out.println("Do regex pattern matches : " + b);

【问题讨论】:

  • 双反斜杠,将开头的/替换为(?i),并删除末尾的/i。其余的由你来检查。并避免转义 / - 它不是特殊的正则表达式元字符。
  • 使用 \\ 而不是 \。喜欢\\d 而不是\d
  • 但现在我无法匹配模式 - 因为在(?i) 之后有/。不要逃避/&lt;&gt;
  • 谢谢@WiktorStribiżew 你能告诉我从哪里可以了解更多吗?

标签: javascript java regex


【解决方案1】:

这个有效。从您的编辑中获得的唯一更改是删除开头的斜线。这是一个简单的 JavaScript 工件。

Pattern p = Pattern.compile(
                "(?i)\\<span\\>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?\\<\\/span\\>");
Matcher m = p.matcher("<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>");
boolean b = m.matches();
        System.out.println("Do regex pattern matches : " + b);

【讨论】:

    【解决方案2】:

    您可以使用 Pattern.CASE_INSENSITIVE 字段选项使您的正则表达式不区分大小写,而不是在您的正则表达式中使用 (?i) 标志:

    Pattern p = Pattern.compile(
        "\\<span\\>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?\\<\\/span\\>",
    Pattern.CASE_INSENSITIVE);
    
    Matcher m = p.matcher("<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>");
    
    System.out.println("Do regex pattern matches : " + m.matches());
    

    注意:

    正如在 Java 中的 cmets 中提到的,您不需要在 slaches / 之间包装您的正则表达式,您需要更新您的正则表达式字符串并从中删除前导 /,它将按预期工作。

    这是 a working Demo

    【讨论】:

    • 它无法匹配任何一种方式。
    • @Softxide 您将需要更新您的正则表达式字符串并删除前导 /,请参阅我的编辑。
    【解决方案3】:

    您应该删除第一个/ 字符并使用Pattern.CASE_INSENSITIVE。 例如:

    String regex = "\\<span\\>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?\\<\\/span\\>";
    
    Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    
    Matcher m = p.matcher("<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>");
    boolean b = m.matches();
    System.out.println("result: "  + b);
    

    输出:

    result: true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      相关资源
      最近更新 更多