Привет, ребята, я работаю в библиотеке валидатора Java. Мой вопрос: как я могу проверить, что входные данные являются альфа (нет буквенно-цифровых) на многих языках. У меня есть следующий REGEX:
public AlphaValidator() {
super();
this.rule = "^[a-zA-Z[*]]+$"; // its fine with : angel, world, bottle, etc.
}
Это нормально, но если библиотека реализована для испанских входов или французских, возможно, со словами типа: vi un ñandu или árbol не соответствуют REGEX.
Я писал специальные символы:
private String getSpanishFilter() {
return "-ñ-Ñ-á-Á-é-É-í-Í-ó-Ó-ú-Ú-ü-Ü";
}
private String getFrenchFilter() {
return "â-à-ç-é-ê-ë-è-ï-î-ô-û-ù-Â-À-Ç-É-Ê-Ë-È-Ï-Î-Ô-Û-Ù";
}
Но я думаю, что это не лучшее решение. Любая помощь?
Не понимаю, почему вы вложили *
внутри вложенного символьного класса. Это не что иное, как объединение, и так же хорошо, как использовать только *
. И чтобы совместить буквы Юникода, вы можете использовать \p{L}
.
И если вы уже на Java 7, вы можете использовать флаг Pattern.UNICODE_CHARACTER_CLASS
или встроенный флаг - (?U)
с заданным шаблоном:
Pattern p = Pattern.compile("^[*\\w&&[^\\d_]]+$", Pattern.UNICODE_CHARACTER_CLASS);
И если вы сохраняете регулярное выражение как строку, тогда используйте встроенный флаг как:
rule = "(?U)^[*\\w&&[^\\d_]]+$";
Вы посмотрели документы для шаблона?
В разделе "Классы для Unicode-скриптов, блоков, категорий и двоичных свойств":
\p{IsAlphabetic} An alphabetic character (binary property)
Таким образом, ваша модель может быть:
"\\p{IsAlphabetic}+"
Самый короткий путь со matches()
:
\\pL+ # no need to add anchors with matches() method
Самый короткий путь с find()
:
\\PL # stop at the first non letter character
Примечание: вы можете также писать \\p{L}
и \\P{L}
, \\pL
и \\PL
- ярлыки.
Но если вам нужно соответствовать только латинским символам, лучше использовать:
\\p{isLatin}+