我知道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是一个无效的转义字符..
答案 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之类的在线正则表达式评估器进行转换。
ECMAScript (JavaScript) FLAVOR
TOOLS -> Code Generator (LANGUAGE - Java)
即使这不是硬核程序员的方式,也明显不容易出错。 尤其是如果您只需要转换一个或两个表达式。
答案 4 :(得分:0)
Java正则表达式首先是字符串,因此必须以双引号而不是/
开头。此外,在java中,您需要通过执行其中两个\
来转义\\
。{{1}}。
请查看Oracle的this教程以获取更多信息。
答案 5 :(得分:0)
如果要在Javascript和Java中使用相同的正则表达式,请尝试在运行时获取正则表达式字符串,而不是尝试在编译时定义正则表达式。在编译时,它将检查语法,并为您提供无效的转义符错误,但是在运行时,它将不检查语法,并将直接编译模式。
如果您可以从API获取正则表达式,或者可以从本地存储的文本文件中读取正则表达式,那么它会很棒。