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

我知道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了

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

只是添加,从我尝试它是说\ x是一个无效的转义字符..

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

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

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


但正如@antak所指出的,Java和Javascript中的正则表达式语言之间存在各种差异。 因此,如果您使用Javascript正则表达式并将其音译为Java,则可能无法正常工作。

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

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

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

如果你真的需要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); 

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

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