我们需要限制字符串中的有效/允许的字符。我们得到的规则如下:
- 空格替换为下划线
- 长度限制为 256(编译器限制)
- 必须介于 ASCII 代码 32(空格)和 126 (~) 之间,并且...
- 它不能包含以下任何内容:
- :(冒号)
- ; (分号)
- ,(逗号)
- '(单引号)
- "(双引号)
- \t(制表符)
- \n(换行)
- \r(回车)
- \\(反斜杠)
任何不符合上述规则的内容都应该用下划线替换。 (我们可以简单地在最后修剪长度规则,除非正则表达式中也有一些东西可以解决这个问题。)
现在我知道如何通过创建这样的类来声明允许的字符,例如字母数字字符......
[a-zA-Z0-9]
...然后在像这样的 Replace 调用中使用相反的值(注意前导克拉)...
var cleanedString = RegEx.Replace(sourceString, "[^a-zA-Z0-9]", replacementString);
...但是我如何处理范围(“必须在 ' ' 和 '~' 之间”条件)以及特别排除的字符?你会像这样进行“或”运算吗?
var cleanedString = RegEx.Replace(sourceString, @"[^ -~]|[;:,'""\t\n\r\\]", replacementString);
注意:这就是在“”(空格)和“~”之间开始范围的方式吗?不确定我是否必须以某种方式显式地逃离该空间。
更一般地说,就像问题标题所问的那样,规则是必须高于 32,但没有上限。如何指定这样一个开放式范围?
最佳答案
第三条规则标识的字符范围称为 ASCII printable characters .
您可以使用表达式[\x20-\x7E]
。
您还可以使用 Unicode 表达式 \P{C}
。
POSIX 字符类 [:print:] 似乎合适,但 .NET 的正则表达式似乎不支持;我尝试的时候没有成功。
引用:http://www.regular-expressions.info/posixbrackets.html
更新:下面是针对OP所述问题的整体解决方案:
static string StripInvalidCharacters(string input)
{
return new System.Text.RegularExpressions.Regex(@"\s|[:;,'""\\]|\p{C}").Replace(input, "_");
}
注意:实际上,您可能希望在此方法之外创建 Regex 对象,以避免每次调用此方法时都重新创建它。
我定义了一个匹配以下条件的表达式:
- 任何空格字符(空格、制表符、回车或换行符)
- 其中之一:冒号、分号、逗号、单引号、双引号、反斜杠
- 任何控制字符。请注意,我在表达式\p{C} 中使用了小写 p,而不是上面在原始答案中提到的大写 P。这是因为大写的 P 否定了 {C} 部分,这意味着“所有控制字符”(引用: http://msdn.microsoft.com/en-us/library/20bw873z.aspx )。因此,表达式\P{C} 基本上意味着“任何不是控制字符”,但在这个代码示例中,因为我用下划线替换字符,所以我想匹配“任何符合以下条件的字符”: 是一个控制字符”,所以我使用\p{C} 表达式。
关于c# - 有没有办法构造一个正则表达式来排除高于或低于某个值的 ASCII 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557340/