我遇到一些 Java 模式问题。这是我的模式:
"^[\\p{L}\\p{Digit}~._-]+$"
它匹配 US-ASCII 的任何字母、数字、一些特殊字符,基本上任何不会扰乱 URL 的内容。
我想要的是找到与此模式不匹配的单词中的第一个字母。基本上,用户发送文本作为输入,我必须验证它并在发现非法字符时抛出异常。
我尝试否定此模式,但它无法正确编译。而且 find()
也没有多大帮助。
合法的输入应该是 hello
而 ?hello
不应该是,我的异常应该指出 ?
不正确。
我更喜欢使用 Java 的 Matcher、Pattern 或使用 util.regex
的建议。这不是必需的,但单独检查字符串中的每个字符并不是解决方案。
编辑:我想出了一个更好的正则表达式来匹配未保留的 URI 字符
最佳答案
试试这个:
^[\\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}~._-]).*$
同样的方法,只是改变了第一部分和第二部分的内容。
我尝试过,似乎有效。
关于java - 正则表达式第一个字符不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593392/