将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的本教程。