匹配ASCII非字母数字字符的正则表达式

4

我需要一个正则表达式来匹配ASCII非字母数字字符。该正则表达式不应匹配非ASCII字符。我正在使用以下内容:

   "[\\u0000-\\u002f\\u003a-\\u0040\\u005b-\\u0060\\u007b-\\u007f]"

Can I simplify this regex ?


为什么 [^a-zA-Z0-9] 不起作用? - Braj
1
@user3218114,“不应匹配非ASCII字符。” - falsetru
@falsetru,感谢您的解释。 - Braj
你只想匹配单个ASCII非字母数字字符吗? - Braj
3个回答

6

是的,您可以使用字符类交集。例如:

[\\p{ASCII}&&\\P{Alnum}]

这意味着:所有ASCII字符和所有非字母数字字符之间的交集。

谢谢,但我需要匹配ASCII和非字母数字字符。所以 "[\\p{ASCII}&&[^\\p{Alnum}]]" 可能会起作用。 - Michael
1
@Michael \P\p 的相反。 - Unihedron
@Michael 但是由于大多数情况下您更喜欢可读性,尽管这个正则表达式更短,但您将发现自己在未来更多地使用集合中的否定类。也就是说,[a&&[^\s]] > [a&&\S] - Unihedron
再次感谢。你关于使用否定类的想法可能是正确的。 - Michael

2
你可以在Java中使用这个正则表达式。
^(?=[^0-9a-zA-Z]+$)\p{ASCII}+$

否则:
^(?!\p{Alnum}+$)\p{ASCII}+$

如果OP在“matches”方法中使用它们,则不需要锚定符。但是,如果它在其他方法(如“find”)中使用,则可能需要。 - anubhava
OP在谈论匹配单个字符,即(?!\p{Alnum})\p{ASCII}。为了在整个字符串上强制执行该条件,您可以这样做:^(?:(?!\p{Alnum})\p{ASCII})+$。您的正则表达式匹配全是ASCII但不全是字母数字的字符串(也就是说,它必须至少包含一个非字母数字字符)。 - Alan Moore

2

太好了!谢谢。看起来正是我需要的。可惜它不是一个“标准”的正则表达式。 - Michael
@Michael 自从程序员滥用正则表达式以来,就再也没有所谓的“标准”正则表达式了 - 编写一行正则表达式通常比编写整个有限状态机进行解析更可行! - Unihedron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接