这里有同样的问题: 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());
这会让我失意。请说明我犯了什么错误,谢谢。
答案 0 :(得分:2)
为什么要将JSNI用于正则表达式? Gwt已经有了处理它们的课程。
我会使用像{Javascript&#39; RegExp。
这样的功能的com.google.gwt.regexp.shared.Regexp
使用gwt com.google.gwt.regexp.shared.RegExp
你有很多好处:
您的代码可能如下:
// 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;标志。
/-*{}*-/