c# - 有没有办法构造一个正则表达式来排除高于或低于某个值的 ASCII 字符?

标签 c# regex replace

我们需要限制字符串中的有效/允许的字符。我们得到的规则如下:

  • 空格替换为下划线
  • 长度限制为 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/

相关文章:

c# - 被 "The remote server returned an error: (403) Forbidden"与 https 中的 WCF 服务难住了

javascript - javascript中正则表达式的 "CouldBe"逻辑

php - 使用 php 替换字符串的每个第二个逗号

如果 PHP 包含整数,则替换整个字符串

regex - 正则表达式,匹配任何东西还是什么都不匹配?

Java:仅替换文件中的一行/字符串

c# - 如何在 C# 中将语法(规则)和听写(自由言论)与 SpeechRecognizer 混合使用

c# - 从 C# 连续处理 SQL 队列(可能是服务代理)

c# - 在 Windows 8 中使用 C# 的 WinRT 中的磁盘空间

javascript - 将一个单词中的所有字母替换为js中的*