【问题标题】:Translating these regexes from javascript to Java将这些正则表达式从 javascript 翻译成 Java
【发布时间】:2012-09-12 06:40:19
【问题描述】:

我的正则表达式在 Javascript 中工作,现在我想将它们翻译成 Java:

            var nat_pattern2 = /^\d{8}$/;
            var nat_pattern2 = /^\d{7}\-\d{1}$/;

            var pct_pattern1 = /^\PCT\/?[A-Z]{2}?\d{4}\/\d{6}$/;
            var ing pct_pattern2 = /^\PCT[A-Z]{2}\d{10}$/;
            var pct_pattern3 = /^\P[A-Z]{2}\d{8}$/;

            var its_pattern1 = /^\ITS\/?[A-Z]{2}?\d{2}\/\d{5}$/;
            var its_pattern2 = /^\ITS[A-Z]{2}\d{7}$/;
            var its_pattern3 = /^\I[A-Z]{2}\d{7}$/;

我的开头看起来是这样的,但它不正确:

Pattern pattern = Pattern.compile("/^\d{8}$/");

你能帮帮我吗?

【问题讨论】:

    标签: java javascript regex


    【解决方案1】:

    您不需要在 Java 中的正则表达式周围使用 /\d 被转义以成为定义正则表达式的字符串的一部分,因此它将变为 \\d

    Pattern pattern = Pattern.compile("^\\d{8}$");
    

    斜线没有特殊含义,因此也不需要转义。

    Pattern natPattern1 = Pattern.compile("^\\d{8}$");
    Pattern natPattern2 = Pattern.compile("^\\d{7}-\\d{1}$");
    
    Pattern pctPattern1 = Pattern.compile("^PCT/?[A-Z]{2}?\\d{4}/\\d{6}$");
    Pattern pctPattern2 = Pattern.compile("^PCT[A-Z]{2}\\d{10}$");
    Pattern pctPattern3 = Pattern.compile("^P[A-Z]{2}\\d{8}$");
    
    Pattern itsPattern1 = Pattern.compile("^ITS/?[A-Z]{2}?\\d{2}/\\d{5}$");
    Pattern itsPattern2 = Pattern.compile("^ITS[A-Z]{2}\\d{7}$");
    Pattern itsPattern3 = Pattern.compile("^I[A-Z]{2}\\d{7}$");
    

    【讨论】:

    • ...这意味着您也不需要转义正则表达式中的斜杠。
    • 是的,他确实不需要它们。
    • 谢谢,但我不确定这些是否正确。例如字符串“PCT/SE2012/001083”应该匹配这些正则表达式之一,但它不匹配。您能否再帮我验证一下这些正则表达式确实与我提供的 javascript 正则表达式匹配。非常感谢!我已经研究了一段时间了,这应该不是一个非常困难的问题,只是一些模式匹配。
    • "PCT/SE2012/001083".matches("^PCT/?[A-Z]{2}?\\d{4}/\\d{6}$") 返回 true。
    【解决方案2】:

    将正则表达式从 JS 翻译成 JAVA 的要点:

    • 无需环绕/
    • 需要转义\(例如\\.而不是\.
    • 无需转义/(即\/变为/
    • 没有最终标志(例如gi

    您现在可以自己翻译您的正则表达式;)

    【讨论】:

    • compile() 方法有参数而不是最终标志,例如 Pattern.DOTALL 用于 /i 等...
    • 感谢您的回答。我已经设法从我的正则表达式中获得了一些结果,但我认为匹配与 javascript 的匹配并不完全相同。 “PCT/SE2012/001083”一词应该与其中一种模式匹配,但事实并非如此。你能告诉我为什么吗?谢谢。
    • @NickRosencratz "PCT/SE2012/001083".matches("^PCT/?[A-Z]{2}?\\d{4}/\\d{6}$") 由我返回 true...
    【解决方案3】:

    \ 用于在Java 字符串中转义。因此,您必须逃避 .所以你的字符串看起来像这样:

    Pattern pattern = Pattern.compile("^\\d{8}$");
    

    如前所述,不需要开头和结尾的 /。

    请注意,如果你想匹配一个 \ 你必须在你的正则表达式中转义它。这意味着您可以在 Java 字符串中对其进行双重转义。 要匹配 \,您必须在 Java 中连接 \\。

    【讨论】:

    • 感谢您的帮助。但是为什么这些模式不匹配: "^PCT/?[A-Z]{2}?\\d{4}/\\d{6}$" 应该匹配像 "PCT/SE2012/001083" 这样的字符串它不是?当它的javascript版本匹配时它不匹配的原因是什么?有没有不完整的地方?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多