Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法构造一个正则表达式来排除高于或低于某个值的ASCII字符?_C#_Regex_Replace - Fatal编程技术网

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

C# 有没有办法构造一个正则表达式来排除高于或低于某个值的ASCII字符?,c#,regex,replace,C#,Regex,Replace,我们需要限制字符串中的有效/允许字符。我们得到的规则如下: 空格替换为下划线 长度限制为256(编译器限制) 必须介于ASCII码32(空格)和126(~)之间,并且 它不能包含以下任何内容: :(冒号) );(分号) ,(逗号) "(单引号) “(双引号) \t(选项卡) \n(新线) \r(回车) \\(反斜杠) 任何不符合上述规则的内容都应该替换为下划线(长度规则我们可以简单地在末尾删减到,除非正则表达式中也有相应的内容) 现在我知道了如何通过为字母数字字符创建这样的类来声明允许的

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

  • 空格替换为下划线
  • 长度限制为256(编译器限制)
  • 必须介于ASCII码32(空格)和126(~)之间,并且
  • 它不能包含以下任何内容:
    • :(冒号)
    • );(分号)
    • ,(逗号)
    • "(单引号)
    • “(双引号)
    • \t(选项卡)
    • \n(新线)
    • \r(回车)
    • \\(反斜杠)
任何不符合上述规则的内容都应该替换为下划线(长度规则我们可以简单地在末尾删减到,除非正则表达式中也有相应的内容)

现在我知道了如何通过为字母数字字符创建这样的类来声明允许的字符

[a-zA-Z0-9]
…然后在这样的替换调用中使用相反的值(注意前面的克拉)

…但是如何处理范围(“必须介于“”和“~”之间”条件)以及特定排除的字符?您是否将其作为这样的“或”操作来执行

var cleanedString = RegEx.Replace(sourceString, @"[^ -~]|[;:,'""\t\n\r\\]", replacementString);
注意:这就是如何在“”(空格)和“~”之间开始一个范围的方法吗?不确定是否必须以某种方式显式转义空格


更一般地说,就像问题的标题所要求的那样,假设规则是它必须大于32,但没有上限。如何指定这样一个开放范围?

AFAIK您只能对字符集(a-z,a-z,0-9)进行范围设置,而不能对ascii表示的范围进行设置

我相信实现这一点的方法是将整个字符串转换为acii,并在(\&#[0-9]{2,3}\)上拆分匹配,然后测试每个字符串


从理论上讲,您可以编写一个正则表达式,明确匹配每一个有效的256长度的可能性。但不要认为您会这样做……这就引出了一个问题,为什么首先要编写正则表达式?

好吧,您只能对字符集(a-z、a-z、0-9)进行范围计算,而不能对ascii表示的范围进行计算

我相信实现这一点的方法是将整个字符串转换为acii,并在(\&#[0-9]{2,3}\)上拆分匹配,然后测试每个字符串


从理论上讲,您可以编写一个正则表达式,显式地匹配每一个有效的256长度的可能性。但不要认为您会这样做……这就引出了一个问题,为什么要首先使用正则表达式?

第三条规则标识的字符范围称为

您可以使用表达式
[\x20-\x7E]

您还可以使用Unicode表达式
\p{C}

POSIX字符类[:print:]似乎是合适的,但是.NET的正则表达式似乎不支持它;我尝试它时它不起作用

参考:

更新:以下是OP所述问题的整体解决方案:

static string StripInvalidCharacters(string input)
{
    return new System.Text.RegularExpressions.Regex(@"\s|[:;,'""\\]|\p{C}").Replace(input, "_");
}
注意:在实践中,您可能希望在此方法之外创建Regex对象,以避免每次调用此方法时都重新创建它

我定义了一个表达式,该表达式符合以下条件:

  • 任意空格字符(空格、制表符、回车符或换行符)
  • 其中之一:冒号、分号、逗号、单引号、双引号、反斜杠
  • 任何控制字符。请注意,我在表达式\p{C}中使用了小写字母p,而不是我在原始答案中提到的大写字母p。这是因为大写字母p否定了{C}部分,这意味着“所有控制字符”(参考:)。因此表达式\p{C}基本上意味着“任何不是控制字符的东西”,但在这个代码示例中,因为我要用下划线替换字符,所以我想匹配“作为控制字符的任何字符”,所以我使用\p{C}表达式

第三条规则标识的字符范围称为

您可以使用表达式
[\x20-\x7E]

您还可以使用Unicode表达式
\p{C}

POSIX字符类[:print:]似乎合适,但.NET正则表达式似乎不支持它;我试的时候没用

参考:

更新:以下是OP所述问题的整体解决方案:

static string StripInvalidCharacters(string input)
{
    return new System.Text.RegularExpressions.Regex(@"\s|[:;,'""\\]|\p{C}").Replace(input, "_");
}
注意:在实践中,您可能希望在此方法之外创建Regex对象,以避免每次调用此方法时都重新创建它

我定义了一个表达式,该表达式符合以下条件:

  • 任意空格字符(空格、制表符、回车符或换行符)
  • 其中之一:冒号、分号、逗号、单引号、双引号、反斜杠
  • 任何控制字符。请注意,我在表达式\p{C}中使用了小写字母p,而不是我在原始答案中提到的大写字母p。这是因为大写的P否定了{C}部分,这意味着“所有控制字符”(参考:)。所以表达式\P{C}基本上意味着“任何不是控制字符的东西”,但是在这个代码示例中,因为我用下划线替换字符,所以我想匹配“任何是控制字符的字符”,所以我使用\P{C}表达式

注意:以下内容实际上与要求相反-查找允许的字符。对于不允许的,是的,我同意问题中引用的OR方法

您可以使用减法字符类(Microsoft.NET支持-请注意,Mono在处理减法字符类时显然存在或曾经存在错误):

第1版

[\x21-\x7e-[\\:;,'"]]
说明:

  • [\x21-\x7e]
    =ASCII 33(0x21)和126(0x7e)之间的字符
  • -[\\:;,“]
    =除了
    \
    (转义),
[!-~-[\\:;,'"]]