当前位置: 首页 > 知识库问答 >
问题:

通过用正则表达式模式否定Unicode字母来验证特殊字符?

西门磊
2023-03-14

这个regex:\p{L}匹配这些字符"示例字符串的ASKJKSDJKDSJÄÖÅüé" "ASKJKSDJK_-。;,DSJ!”#€%

我想匹配多种语言中任何和所有不是字母或数字的字符。

一个负正则表达式可能是一个自然的方向吗?

我应该提到我想找到的正则表达式的一个预期用途是验证规则的密码:

  • 它需要包含至少一个特殊字符,我定义为不是数字也不是字母。

如果可能的话,似乎应该避免定义特殊字符的范围,因为为什么要限制这种可能性?这就是我的定义。我想这么宽泛的定义可能会有一些问题,但这是第一步。

如果你对我下面给出的更好的解决方案有一些建议,或者只是对这个问题有一些想法,我相信我不是唯一一个想了解它的人。谢谢

注意,我在Java代码中使用了双\\。平台Java11。

共有2个答案

封弘伟
2023-03-14

因此,在阅读了类似但不完全相同的问题和一些同样优秀的答案后,我想出了这个解决方案(?=\P{L})(?=\P{N})意思是既不匹配字母也不匹配数字。即使我分别声明数字,我也需要否定这两个数字,以满足特殊字符的规范(参见问题)。

这是在使用带有括号和的非消耗正则表达式?=,首先匹配第一个括号中的表达式,然后继续匹配第二个括号中的整个表达式。感谢@Jason Cohen在正则表达式中提供的详细信息:是否有AND运算符?讨论。

\P{L}\P{N}中的大写字母P表示Unicode类别中的“不属于类别”,其中大写字母P表示“不”,即小写字母P的对立面。

对于现实世界的解决方案来说,这并不完美,但至少可以作为一个起点。注意,我在Java代码中使用了double\\。平台是Java11。

范振海
2023-03-14

你可以把那些\\p东西塞进[]里。因此,使用你可以否定字符组的事实。这就是你所需要的:

Pattern p = Pattern.compile("[^\\p{L}]");
Matcher m = p.matcher("ASKJKSDJK_-.;,DSJÄÖÅ!”#€%&/()=?`¨’<>üé");
while (m.find()) System.out.print(m.group(0));

打印:

_-.;,!”#€%&/()=?`¨’<>

这正是你想要的,不是吗?

没必要在这里和长相怪捣乱。

 类似资料:
  • 我需要一个带有特殊字符的正则表达式电子邮件验证。 规则: 本地部分可能有2个或更多字符长度 本地部分包含特殊字符 当前正则表达式: 测试模式: 我需要一个正则表达式,它将验证为:

  • 问题内容: 我的密码强度标准如下: 长度为8个字符否特殊字符Atleast 1个数字Atleast 1个字母 问题答案: 更新: Xcode 8.3.2•Swift 3.1

  • 我需要允许字段使用字母数字和某些其他字符。我正在使用这个正则表达式: 允许的特殊字符是 “_”。我做错了什么?

  • 我创建了以下正则表达式: 它应该接受字母数字、空格和撇号。输入应至少为1个字符,最多为24个字符。但它也只接受带撇号和空格的输入(例如,

  • 问题内容: 我想编写一个简单的正则表达式来检查给定字符串中是否存在任何特殊字符。我的正则表达式可以工作,但是我不知道为什么它还包括所有数字,所以当我输入一些数字时会返回错误。 我的代码: 问题答案: 请不要那样做…… 像这样的小Unicode BABY ANGEL 快要死了!◕◡◕(←这些不是图像)(箭头也不是!) 而且您正在杀死20年的DOS:-)(最后一个笑脸称为WHITE SMILING F

  • 我试图为密码字段创建一个验证,它只允许字符和 时有什么区别,以及哪些字符来自