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

Java 正则表达式第一个字符不匹配,java,regex,find,match,Java,Regex,Find,Match,我遇到了一些Java模式问题。这是我的模式: "^[\\p{L}\\p{Digit}~._-]+$" 它匹配US-ASCII的任何字母、数字、一些特殊字符,基本上任何不会扰乱URL的字符 我想要的是在一个单词中找到与此模式不匹配的第一个字母。基本上,用户发送一个文本作为输入,我必须验证它,如果我发现非法字符,就会抛出异常 我试图否定这个模式,但它无法正确编译。而且find()也帮不了什么忙 合法的输入应该是hello,而?hello不应该是,我的例外应该指出?是不正确的 我更喜欢使用Java的

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

"^[\\p{L}\\p{Digit}~._-]+$"
它匹配US-ASCII的任何字母、数字、一些特殊字符,基本上任何不会扰乱URL的字符

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

我试图否定这个模式,但它无法正确编译。而且
find()
也帮不了什么忙

合法的输入应该是
hello
,而
?hello
不应该是,我的例外应该指出
是不正确的

我更喜欢使用Java的Matcher、模式或使用
util.regex
的东西。这不是必须的,但是单独检查字符串中的每个字符并不是一个解决方案


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

试试这个,找到第一个无效字符:

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) + "'");
}

请尝试此项以查找第一个无效字符:

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) + "'");
}
“^[\\p{L}\\p{Digit}.-.''.'+$”
模式匹配任何包含字符类内定义的1+个字符的字符串。请注意,double
'
是可疑的,您可能不知道
'-.
创建了一个范围并匹配
'()*+,-.
。如果不是故意的,我想你是想用
”——

要检查字符串是否以字符类中定义的字符以外的字符开头,可以对字符类求反,并仅检查字符串中的第一个字符:

if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) {
   /* String starts with the disallowed character */ 
}
我还认为可以将正则表达式缩短为
“(?U)[^\\w.-].*”
。无论如何,
\\p{Digit}
可以替换为
\\d
“^[\\p{L}\\p{Digit}.-.“\u]+$”
模式匹配任何包含字符类内定义的1+个字符的字符串。请注意,double
'
是可疑的,您可能不知道
'-.
创建了一个范围并匹配
'()*+,-.
。如果不是故意的,我想你是想用
”——

要检查字符串是否以字符类中定义的字符以外的字符开头,可以对字符类求反,并仅检查字符串中的第一个字符:

if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) {
   /* String starts with the disallowed character */ 
}
我还认为可以将正则表达式缩短为
“(?U)[^\\w.-].*”
。无论如何,
\\p{Digit}
可以替换为
\\d

尝试以下方法:

^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$
第一个不匹配的字符是第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}~._-]).*$
这是同样的方法,我只改变了第一部分和第二部分的内容

我试过了,似乎很管用。

试试这个:

^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$
第一个不匹配的字符是第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}~._-]).*$
这是同样的方法,我只改变了第一部分和第二部分的内容


我试过了,但似乎效果不错。

!“?hello.”子字符串(0,1).匹配(“^[\\p{L}\\p{Digit}.-.''+$”)
?您能分享一些您正在尝试执行的操作的代码吗?正在尝试清理GET/POST参数?或者整个URL?为什么在单个字符类中使用2
?另外,
“-.
创建一个范围(并匹配
”()*+,-.
),这是故意的吗?顺便说一句,如果(str.matches([^\\p{L}\\p{Digit}.'''.-].*){/*错误!*/}谢谢你的观察
!“?hello.”子字符串(0,1).匹配(“^[\\p{L}\\p{Digit}.-.''+$”)
?您能分享一些您正在尝试执行的操作的代码吗?正在尝试清理GET/POST参数?或者整个URL?为什么在单个字符类中使用2
?另外,
“-.
创建一个范围(并匹配
”()*+,-.
),这是故意的吗?顺便说一句,试试
if(str.matches([^\\p{L}\\p{Digit}.''.-].*){/*Error!*/}
谢谢你的观察,我会把它称为公认的答案,但我最初的正则表达式做得不好,所以我根据你的建议编辑了这个问题,编辑后,我认为这应该是正确的否定匹配:
“^[\\p{L}\\p{Digit}.{-]*([^\\p{L}\\p{Digit}.{-]).$“
我会把它称为公认的答案,但我最初的正则表达式做得不好,所以我根据你的建议编辑了这个问题,编辑后,我认为这应该是正确的否定匹配:
“^[\\p{L}\\p{Digit}.{-]*([^\\p{L}\\p{Digit}.]
感谢您的帮助,这个java Matcher的工作方式非常不直观感谢您的帮助,这个java Matcher的工作方式非常不直观