繁体   English   中英

将 Javascript 正则表达式转换为 Java 语法

[英]Convert Javascript regular expression to Java syntax

我知道 regEx 在语言中很常见……但是我在编写 Java 语法时遇到了麻烦。 我有一个用 JS 编码的正则表达式;

if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))         
return true;

我如何在 Java 中编写相同的内容?

我已经进口

import java.util.regex.Matcher;
import java.util.regex.Pattern;

补充一点,从我的尝试来看,\\x 是一个无效的转义字符。

将前导和尾随'/'字符更改为'"' ,然后将每个'\\'替换为"\\\\"

与 JavaScript、Perl 和其他脚本语言不同,Java 没有用于正则表达式的特殊语法。 相反,它们(通常)使用 Java 字符串文字来表示。 但是'\\'是 Java 字符串文字中的转义字符,因此原始正则表达式中的每个'\\'都必须使用第二个'\\'进行转义。 (如果正则表达式中有文字反斜杠字符,则在 Java 字符串文字中最终会出现"\\\\\\\\" !!)

这对于 Java 新手来说有点令人困惑/令人生畏,但它完全合乎逻辑。 请记住,您正在使用 Java字符串文字来表达正则表达式。


但是,正如@antak 所指出的,Java 和 JavaScript 实现的正则表达式语言之间存在各种差异。 因此,如果您使用任意 JavaScript 正则表达式并将其音译为 Java(如上所述),它可能无法正常工作。

以下是一些总结差异的参考资料。

您可以使用在线正则表达式评估器(https://regex101.com)进行转换。

  1. 转到https://regex101.com
  2. 选择ECMAScript (JavaScript) FLAVOR
  3. 插入您的正则表达式
  4. 打开TOOLS -> Code Generator (LANGUAGE - Java)
  5. 复制粘贴

即使它不是硬核程序员的方式,它也明显不太容易出错。 特别是如果您只需要转换一两个表达式。

如果您真的需要 Java 中的 Javascript 正则表达式语义,一种方法是使用嵌入式 Javascript 引擎来评估正则表达式。 例如:

javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = se.getEngineByName("js");

String regExp = "/^\\d+$/";
engine.put("str", "1234");
engine.eval("var rgx=" + regExp);
Object value = engine.eval(
    "function validate(r, s){ return (r).test(s);};validate(rgx, str);");
logger.log(value);

您唯一需要做的就是复制反斜杠。

Pattern p1 = Pattern.compile("[a-zA-Z]");
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]");

if (p1.matcher(str).find() && p2.matcher(str).find()) {
    return true;
}

如果您想在 Javascript 和 Java 中使用相同的正则表达式,请尝试在运行时获取正则表达式字符串,而不是尝试在编译时定义正则表达式。 在编译时它会检查语法并给出无效的转义字符错误,但是在运行时它不会检查语法并直接编译模式。

如果您可以从 API 获取正则表达式或可以从本地存储的文本文件中读取它,那就太好了。

Java 正则表达式首先是字符串,因此您必须以双引号而不是/开头。 此外,在java中,您需要通过执行其中两个像这样的\\\\来转义\\

有关更多信息,请查看 Oracle 的教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM