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

validate special characters by negating unicode letters with regex pattern?

此正则表达式:\p{L}+ 匹配示例字符串“ASKJKSDJK_-.;,DSJÄÖÅ!”的这些字符“ASKJKSDJKDSJÄÖÅüé”#€%&/()=?`¨'<>üé “这很好,但与我想要的完全相反。这导致我否定正则表达式。

目标:

我想匹配多种语言中不是字母也不是数字的所有字符。

否定的正则表达式可以成为这个的自然方向吗?

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

似乎应该尽可能避免定义特殊字符的范围,因为为什么要限制可能性?因此我的定义。我认为如此广泛的定义可能会出现一些问题,但这是第一步。

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

请注意,我在 Java 代码中使用了双 \。平台是 Java 11.

所以在阅读了类似但不完全相同的问题和一些同样出色的答案后,我想到了这个解决方案:(?=\P{L})(?=\P{N}) 意思是匹配两个非字母 不数字。即使我单独断言数字,我也需要否定两者以满足特殊字符的规范(参见问题)。

这是利用带括号的non-consuming正则表达式和?=,首先匹配第一个括号中的表达式,然后继续匹配第二个括号中的整体。感谢@Jason Cohen 在 Regular Expressions: Is there an AND operator? 讨论中提供此详细信息。

\P{L}\P{N}中的大写P表示Unicode Categories中的“不属于某一类别”,其中大写P表示“不”,即与小写 p.

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

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

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

打印:

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

这正是您要找的,不是吗?

不需要在这里搞乱前瞻。