Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Javascript正则表达式转换为Java语法_Java_Javascript_Regex_Matcher - Fatal编程技术网

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

将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

我知道正则表达式在各种语言中都很常见……但是我在编写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是一个无效的转义字符。

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

与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获取正则表达式,或者可以从本地存储的文本文件中读取正则表达式,这将非常棒。

您可以使用在线正则表达式计算器进行转换

  • 选择ECMAScript(JavaScript)风格
  • 插入正则表达式
  • 打开
    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一些编码转义逻辑!