正则表达式第一个字符不匹配

时间:2016-04-13 08:58:59

标签: java regex find match

我遇到了一些Java Pattern问题。这是我的模式:

"^[\\p{L}\\p{Digit}~._-]+$"

它匹配US-ASCII的任何字母,数字,一些特殊字符,基本上任何不会扰乱URL的字母。

我想要的是找到一个与该模式不匹配的单词中的第一个字母。基本上用户发送文本作为输入,我必须验证它并在我发现非法字符时抛出异常。

我尝试否定这种模式,但它无法正确编译。 find()也没有多大帮助。

合法输入为hello?hello不应该,而我的例外情况应该指出?不合适。

我更喜欢使用Java的Matcher,Pattern或使用util.regex的建议。它不是必需的,但单独检查字符串中的每个字符不是解决方案。

编辑:我想出了一个更好的正则表达式来匹配未保留的URI字符

3 个答案:

答案 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

相关问题