33

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

4

6 回答 6

46

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

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

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


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

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

于 2012-01-06T07:00:33.700 回答
22

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

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

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

于 2019-08-20T14:05:28.523 回答
4

如果您真的需要 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);
于 2017-10-23T05:35:25.960 回答
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;
}
于 2012-01-06T07:02:41.123 回答
0

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

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

于 2012-01-06T07:03:54.507 回答
0

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

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

于 2018-10-22T08:56:07.960 回答