- 09-02-2009
GWT :: Полезные советы :: Регулярные выражения
Регулярные выражения в GWT
Одним из наиболее популярных AJAX фреймворков для джавистов является Google Web Toolkit или GWT. Его суть состоит в том, чтобы конвертировать исходный Java-код в соответствующий javascript исполняющийся в браузере клиента.
Звучит все вышесказанное хорошо, да и популярность высокая, но вот беда — есть вещи которые GWT не умеет конвертировать в javascript по умолчанию. А если быть точнее, то все обстоит как раз наоборот — есть ограниченный список того что GWT умеет конвертировать, и множество классов с которыми GWT еще не разобрался. Не спорю, парни из гугла творят чудеса и от версии к версии GWT пополняется новыми возможностями, но и наши с Вами задачи не ждут, а требуют немедленного решения. Вот так и один из популярных стандартных пакетов java.util.regex не поддерживается текущей версией GWT v.1.5.
Приведу пример: в любом Java SE приложении у Вас есть возможность проверить входящие данные от пользователя с помощью регулярного выражения. Например, если поле ввода должно содержать только латинские символы, цифры и подчеркивание Вы можете воспользоваться следующим кодом:
Pattern p = Pattern.compile("\w+");
Matcher m = p.matcher("Test string");
if (m.matches()){
//TODO: something
};
Однако, как я уже упоминал выше, GWT ограничен перечнем классов, которые он может конвертировать в javascript и, к сожалению, ни Pattern, ни Matcher к ним не относятся. Теоретически из этой ситуации есть выход — натравить GWT на исходнике пакета java.util.regex и заставить его скомпилировать и их... Но! Кто знает, что за собой потянет этот «паровоз» ;) .
Я же предлагаю Вам воспользоваться другим подходом! Как известно, GWT очень хорошо поддерживает класс java.lang.String. А у этого класса есть замечательный метод: public String[] split(String regex) , который умеет делить заданную строку на фрагменты по признаку-разделителю, в качестве которого используется регулярное выражение. Т.о. если в искомой строке есть одно и только одно вхождение регулярного выражения, метод split вернет массив нулевой размерности, во всех остальных случаях это будет массив строк, содержащих фрагменты строки.
Именно этот подход и используется в следующем коде, отлично пережевываемом GWT:
String[] msgArr = testString.split("\w+");
if (msgArr.length == 0){
//TODO: something
}
Как это можно использовать на практике!? Например, можно выполнять проверку правильности заполнения поля для e-mail в пользовательской GWT форме:
String[] msgArr = testString.split("(\w+.)*\w+@(\w+.)+[A-Za-z]+");
if (msgArr.length != 0){
Window.alert("Wrong e-mail!");
}Vyacheslav Yakovenko специально для LifeIn
GWT :: Полезные советы :: Регулярные выражения (Part 2)
| Комментарии к статье "GWT :: Полезные советы :: Регулярные выражения" (7) |
| 09-04-2009 21-25 2 dart: "Так отож" - оказывается существуют "known limitations" ;) . Одно радует - заметки читают и пытаются скомпилировать, значт это все-таки кому-то нужно. |
|
|
| 08-04-2009 20-30 Ошибка прямо в первом примере.. и во всех следующих Pattern p = Pattern.compile("w+"); не компилируется. Строка должна выглядеть так : ..."\w+"... вы когда примеры писали даже компилировать их не пробовали?? |
| 22-02-2009 08-09 2 Nickolai Kurutin: Не совсем понятно, что Вы имеете в виду под "И всё компилиться ;)" - да, компилится, а почему бу ему и не компилироваться?! Ведь вы же используете метод .matches класса String, естественно будет компилироваться. Другой вопрос если бы вы в GWT модуле используете Pattern p = Pattern.compile("w+"); - вот тогда я с удовольствием послушаю Ваши рекомендации по тому как Вы его собираете. |
| 16-02-2009 12-11 String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.(?:[a-zA-Z]{2,6})$"; boolean valid = false; valid = ((String) value).matches(emailPattern); И всё компилиться ;) |
| 11-02-2009 10-43 2 Dmitriy Morozov: Интересно... Не хотите поделиться с нашими читателями подробной информацией?! Набросайте пример и краткое описание, а мы его опубликуем. Спасибо |
| 11-02-2009 10-22 Спасибо за статью. Полезный трик. Я использовал JSNI когда мне нужны были регулярные выражения. // JSNI method public native boolean validateMailAddress(String mail) /*-{ var mailReg = "^[\w-_.]*[\w-_.]@[\w].+[\w]+[\w]$"; var regex = new RegExp(mailReg); return regexp.test(mail); }-*/; |