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

时间:2012-01-06 06:57:12

标签: java javascript regex matcher

我知道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是一个无效的转义字符..

6 个答案:

答案 0 :(得分:36)

将前导'/'字符更改为'"',然后将'\'替换为"\\"

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

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


然而正如@antak所说,Java和Javascript中的正则表达式语言之间存在各种差异。因此,如果您使用Javascript正则表达式并将其音译为Java,则可能无效。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

如果你真的需要Java中的Javascript regex语义,一种方法是使用嵌入式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);

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

请查看Oracle的this教程以获取更多信息。

答案 5 :(得分:0)

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

如果您可以从API获取正则表达式,或者可以从本地存储的文本文件中读取正则表达式,那么它会很棒。