繁体   English   中英

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

[英]Regex first character not matching

我遇到一些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}~._-]).*$

这是相同的方法,我只更改第一部分和第二部分的内容。

我尝试了,它似乎有效。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM