我遇到了一些Java Pattern问题。这是我的模式:
"^[\\p{L}\\p{Digit}~._-]+$"
它匹配US-ASCII的任何字母,数字,一些特殊字符,基本上任何不会扰乱URL的字母。
我想要的是找到一个与该模式不匹配的单词中的第一个字母。基本上用户发送文本作为输入,我必须验证它并在我发现非法字符时抛出异常。
我尝试否定这种模式,但它无法正确编译。 find()
也没有多大帮助。
合法输入为hello
而?hello
不应该,而我的例外情况应该指出?
不合适。
我更喜欢使用Java的Matcher,Pattern或使用util.regex
的建议。它不是必需的,但单独检查字符串中的每个字符不是解决方案。
编辑:我想出了一个更好的正则表达式来匹配未保留的URI字符
答案 0 :(得分:1)
试试这个:
^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$
第一个不匹配的字符是组n°1
我在这里试了几次:http://fiddle.re/gkkzm6 1
说明:
我否定了你的模式,所以我建立了这个:
[^\\p{L}\\p{Digit}.'-.'_] [^...] means every character except for
^ ^ the following ones.
| your pattern inside |
该模式有3个部分:
^[\\p{L}\\p{Digit}.'-.'_]*
检查第一个字符的正则表达式,直到遇到不匹配的字符
([^\\p{L}\\p{Digit}.'-.'_])
捕获组内的不匹配字符(否定)
.*$
任何字符,直到字符串结尾。
希望它可以帮到你
编辑:
正确的正则表达式应该是:
^[\\p{L}\\p{Digit}~._-]*([^\\p{L}\\p{Digit}~._-]).*$
这是同样的方法,我只改变第一和第二部分的内容。
我试过了,似乎有效。
答案 1 :(得分:0)
尝试这个找到第一个无效的char:
Pattern negPattern = Pattern.compile(".*?([^\\p{L}^\\p{Digit}^.^'-.'^_]+).*");
Matcher matcher = negPattern.matcher("hel?lo");
if (matcher.matches())
{
System.out.println("'" + matcher.group(1).charAt(0) + "'");
}
答案 2 :(得分:0)
"^[\\p{L}\\p{Digit}.'-.'_]+$"
模式匹配在字符类中定义的包含1+个字符的任何字符串。请注意,双'
和.
是可疑的,您可能不知道'-.
创建范围并匹配'()*+,-.
这一事实。如果不是故意的,我认为您打算使用.'_-
。
要检查字符串是否以字符类中定义的字符开头,您可以否定字符类,并仅检查字符串中的第一个字符:
if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) {
/* String starts with the disallowed character */
}
我还认为你可以将正则表达式缩短为"(?U)[^\\w.'-].*"
。无论如何,\\p{Digit}
可以替换为\\d
。