2014-11-20 1 views
0

Этот вопрос задал здесь: How to pass a regular expression as a function parameter, но я не могу заставить его работать JSNI.Как использовать регулярное выражение javascript jsni?

Это строка регулярного выражения, которое будет использоваться для проверки электронной почты:

"^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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 выполнить так:

/^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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("[email protected]") 

это даст то, что я хочу , но если окружив его к способу JSNI:

private native String reEmail()/-*{ 
     return "^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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("[email protected]",reEmail()); 

Это даст мне false.Please сказать, что ошибки, которые я сделал, спасибо.

ответ

2

Почему вы хотите использовать JSNI для регулярных выражений ?. У Gwt уже есть классы для борьбы с ними.

Я бы использовал com.google.gwt.regexp.shared.Regexp, который имеет функции, такие как RegExp от Javascript.

Использование GWT com.google.gwt.regexp.shared.RegExp у вас есть много преимуществ:

  • не приходится иметь дело с JSNI, экономя синтаксические ошибки.
  • сделать ваш код пригодным для тестирования, поскольку RegExp может использоваться в JVM.
  • Пусть реализация исключает строки или что-то еще.
  • производительность будет такой же

Ваш код может быть как:

// Note that you have to double escape \ 
RegExp r = RegExp.compile("^(([^<>()[\\]\\\\.,;:\\[email protected]\"]+(\\.[^<>()[\\]\\\\.,;:\\[email protected]\"]+)*)|(\".+\"))@((\\[[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("[email protected]")) { 

} else { 

} 

Во всяком случае, если вы по-прежнему хочет, чтобы сделать на вашем пути, чтобы сделать ваш код работать, вы должны избежать вашей строки перед тем вернувшись в java вместо того места, которое вы пытаетесь сделать, ваш синтаксис блока JSNI неверен, обратите внимание на /*-{}-*/ вместо /-*{}*-/. И вам не нужен флаг «g».

validate("[email protected]",reEmail()); 

private native String reEmail() /*-{ 
    return "^(([^<>()[\\]\\\\.,;:\\[email protected]\"]+(\\.[^<>()[\\]\\\\.,;:\\[email protected]\"]+)*)|(\".+\"))@((\\[[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)/*-{ 
    return new RegExp(regexp).test(value) 
}-*/;