我试图写一个Regex来阻止用户在 postcode 字段中输入无效字符。从this link我试图排除所有的“非字”字符像这样。
Regex
Regex regex = new Regex(@"[\W_]+"); string cleanText = regex.Replace(messyText, "").ToUpper();
但这也排除了“空间”字符。我相信这是可能的,但我发现regex非常令人困惑!有人能帮忙解释一下所使用的正则表达式模式吗?
niwlg2el1#
您可以反转您的字符类,使其成为取反字符类,如下所示:
[^\sa-zA-Z0-9]+
这将匹配除空格或字母数字字符以外的任何字符。RegEx Demo(因为这不是.NET正则表达式)
pnwntuvh2#
假设有效的邮政编码只包含字母数字字符,您可以用空字符串替换除字母数字和空格之外的任何字符:
Regex regex = new Regex(@"[^a-zA-Z0-9\s]"); string cleanText = regex.Replace(messyText, "").ToUpper();
请注意,\s包括制表符,换行符和其他一些不可打印的字符。您可能不希望将其视为有效。在这种情况下,只需按字面意思列出空白字符:
\s
[^a-zA-Z0-9 ]
5uzkadbs3#
这个正则表达式将捕获除字母、数字和空格之外的所有内容。[^\w\s\d]|_[ ]中的^将导致正则表达式查找除***字母、数字和空格之外的所有内容。
[^\w\s\d]|_
[ ]
^
x7rlezfr4#
您可以使用character class subtraction:
[\W_-[\s]]+
它匹配一个或多个非单词和下划线符号,但任何空格字符除外。
若要仅排除 * 水平 * 空白字符,请在减法部分使用[\p{Zs}\t]:
[\p{Zs}\t]
[\W_-[\p{Zs}\t]]+
要仅排除 * 垂直 * 空白字符(换行符),请在减法部分使用[\n\v\f\r\u0085\u2028\u2029]:
[\n\v\f\r\u0085\u2028\u2029]
[\W_-[\n\v\f\r\u0085\u2028\u2029]]+
非字符类减法解决方案(更便于移植)为
[^\w\s]+
它匹配一个或多个除单词和空白字符以外的字符。请注意,这仍然不会匹配被认为是单词字符的_(这在(?:[^\w\s]|_)+或[_\W-[\s]]更可取的字符串标记化场景中很重要)。
_
(?:[^\w\s]|_)+
[_\W-[\s]]
4条答案
按热度按时间niwlg2el1#
您可以反转您的字符类,使其成为取反字符类,如下所示:
这将匹配除空格或字母数字字符以外的任何字符。
RegEx Demo(因为这不是.NET正则表达式)
pnwntuvh2#
假设有效的邮政编码只包含字母数字字符,您可以用空字符串替换除字母数字和空格之外的任何字符:
请注意,
\s
包括制表符,换行符和其他一些不可打印的字符。您可能不希望将其视为有效。在这种情况下,只需按字面意思列出空白字符:5uzkadbs3#
这个正则表达式将捕获除字母、数字和空格之外的所有内容。
[^\w\s\d]|_
[ ]
中的^
将导致正则表达式查找除***字母、数字和空格之外的所有内容。x7rlezfr4#
您可以使用character class subtraction:
它匹配一个或多个非单词和下划线符号,但任何空格字符除外。
若要仅排除 * 水平 * 空白字符,请在减法部分使用
[\p{Zs}\t]
:要仅排除 * 垂直 * 空白字符(换行符),请在减法部分使用
[\n\v\f\r\u0085\u2028\u2029]
:非字符类减法解决方案(更便于移植)为
它匹配一个或多个除单词和空白字符以外的字符。请注意,这仍然不会匹配被认为是单词字符的
_
(这在(?:[^\w\s]|_)+
或[_\W-[\s]]
更可取的字符串标记化场景中很重要)。