将Javascript正则表达式转换为Java语法
我知道正则表达式在各种语言中都很常见……但是我在编写Java语法时遇到了麻烦。 我有一个用JS编码的正则表达式,如下所示:将Javascript正则表达式转换为Java语法,java,javascript,regex,matcher,Java,Javascript,Regex,Matcher,我知道正则表达式在各种语言中都很常见……但是我在编写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
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是一个无效的转义字符。将前导和尾随的
'/'
字符更改为''
,然后将每个'\'
替换为'\\'
与JavaScript、Perl和其他脚本语言不同,Java没有针对正则表达式的特殊语法。相反,它们(通常)使用Java字符串文字表示。但是'\'
是Java字符串文字中的转义字符,因此原始正则表达式中的每个'\'
都必须使用第二个'\'
转义。(如果在正则表达式中有一个反斜杠字符,那么在Java字符串literal!!中会出现“\\\\\”
)
对于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正则表达式是最重要的字符串,因此必须以双引号开始,而不是
/
。此外,在Java中,您需要像这样执行两个\
来转义\
有关更多信息,请参阅Oracle教程。如果您确实需要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);
如果您希望在Javascript和Java中使用相同的正则表达式,请尝试在运行时获取正则表达式字符串,而不是在编译时尝试定义正则表达式。在编译时,它将检查语法,并会给您提供无效的转义符错误,但在运行时它不会检查语法,而是直接编译模式
如果您可以从API获取正则表达式,或者可以从本地存储的文本文件中读取正则表达式,这将非常棒。您可以使用在线正则表达式计算器进行转换
TOOLS->code生成器(语言-Java)
特别是当你只需要转换一个或两个表达式时。Thx很多。我没有完全理解第二部分…用“\”替换每个“\”…它们都不一样吗?@testndtv-我说“必须用第二个反斜杠转义”“。我没有说它必须被替换。要是能这么简单就好了……Java中的正则表达式和JS中的正则表达式有细微的差别,这会让那些不知道的人感到难受:例如,JS:
'ab]cd.replace(/[^]]/g,'()')
->a()cd
,Java:“ab]cd.replaceAll([^]],“()”
->()()())
@testndtv:千万不要在没有显示错误消息的情况下说您遇到了错误。它缺少第二个find()
调用;现在再试一次。Thx…实际上我用.matches()替换了它,我希望它也可以…请确认..这不是正则表达式引擎本身,而是matches()
方法,该方法要求正则表达式使用整个字符串,就像它被锚定在两端一样。find()
方法执行更传统的匹配类型,但不能像使用matches()那样从字符串对象调用它
;您必须显式创建一个Matcher对象,如。@Alanmore:谢谢您让我知道。我很少使用find,我几乎总是使用matches()
。我已经从我的答案中删除了这一部分,再次感谢你的澄清。我盯着一些长的JS正则表达式,并将NPM模块重新编程到一个Java包中……我小心地避开了逃逸,以逃避我的头痛……在这次逃逸结束时,这个答案帮助我摆脱了我的怀疑,即我的逃逸序列已经逃逸d一些编码转义逻辑!