我需要升级我的一个正则表达式

时间:2011-06-05 09:22:00

标签: java regex

目前我使用以下正则表达式来验证JSF中的textArea:

"^([a-zA-Z0-9]+[a-zA-Z0-9 ]+$)?"

它允许我有多个单词以及大写和小写字符,但仍然不够,我需要让它变得更好。它还应该只允许一些特殊字符。你有任何想法,我怎么能调整它能够:

- 允许以下4个字符, . ; :

- 还包括非英语字母表中的特殊字母,这是所需的字母:Đ đ Ž ž Ć {{1 }} ć Č č Š

我将我的网络应用程序配置为使用UTF-8,如果常规表达式只允许那些特殊字母,那就太好了,因为每次验证每个字段的编码都会减少。

2 个答案:

答案 0 :(得分:4)

只需将它们添加到标有[]

的字符集中即可
"^([a-zA-Z0-9,.;:ĐđŽžĆćČ芚]+[a-zA-Z0-9 ,.;:ĐđŽžĆćČ芚]+$)?"

除了你的问题之外,还有一个关于性能改进的建议:第一部分可能是因为reg-exp可以从允许的字符之一开始,但是空格。由于这只是第一个字符的特殊情况,请删除+号。这样,它只匹配第一个字符。无论如何,成功的角色将与第二部分匹配。

"^([a-zA-Z0-9,.;:ĐđŽžĆćČ芚][a-zA-Z0-9 ,.;:ĐđŽžĆćČ芚]+$)?"

答案 1 :(得分:4)

如果特殊字符全部来自同一个unicode bock,则可以将它们与表达式\p{InGreek}匹配,将Greek替换为字符来自的块。您还可以使用负向lookbehind来防止匹配前导空格。这将使正则表达式:

^(?! )[\p{Alnum}\p{InLatinExtendedA},.;: ]+$

如果你不想在领先的空间上快速失败,正如你的评论所暗示的那样,你可以使用这个正则表达式修剪前导和尾随空格:

^\s*([\p{Alnum}\p{InLatinExtendedA},.;: ]+?)\s*$

第一个捕获组将是没有前导或尾随空格的有效字符串。