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