如何使用jsni的javascript正则表达式?

时间:2014-11-20 06:17:59

标签: regex gwt jsni

这里有同样的问题: How to pass a regular expression as a function parameter,但我无法通过JSNI得到它。

这是将用于测试电子邮件的正则表达式的字符串:

 "^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$"

如果把它放到firebug上就像这样执行:

/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$"/.test("test@domain.com")

它会提供我想要的东西,但是如果将它包装到JSNI方法中:

 private native String reEmail()/-*{
      return "^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";
 }-*/;

然后将其传递给函数:

private native boolean validate(String value, String regexp)/-*{
    //escape special characters
   var re=regexp.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').replace(/\x08/g, '\\x08');
    return new RegExp(re,'g').test(value)
}-*/;
像这样:

 validate("test@domain.com",reEmail());

这会让我失意。请说明我犯了什么错误,谢谢。

1 个答案:

答案 0 :(得分:2)

为什么要将JSNI用于正则表达式? Gwt已经有了处理它们的课程。

我会使用像{Javascript&#39; RegExp。

这样的功能的com.google.gwt.regexp.shared.Regexp

使用gwt com.google.gwt.regexp.shared.RegExp你有很多好处:

  • 不必处理JSNI,节省了语法错误。
  • 使您的代码可测试,因为RegExp可以在JVM中使用。
  • 让实现转义字符串或其他任何内容。
  • 表现会相同

您的代码可能如下:

// Note that you have to double escape \
RegExp r = RegExp.compile("^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$");
if (r.test("test@domain.com")) {

} else {

}

无论如何,如果你继续想要以你的方式做,为了使你的代码工作,你应该在返回java而不是你想要做的地方之前转义你的字符串,你的JSNI块语法也是错误的,请注意{ {1}}代替/*-{}-*/。你不需要&#39;&#39;标志。

/-*{}*-/