Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
.net 正则表达式删除除CR或LF以外的所有控制/不可见字符_.net_Regex_Unicode - Fatal编程技术网

.net 正则表达式删除除CR或LF以外的所有控制/不可见字符

.net 正则表达式删除除CR或LF以外的所有控制/不可见字符,.net,regex,unicode,.net,Regex,Unicode,我试图使用regex(.Net)来“清理”Unicode输入字符串——要求删除除CR(回车)和LF(换行符)之外的所有不可见字符/控制字符。换句话说,保留所有有效的可打印字符(英语和法语),包括CR和LF 我尝试了以下方法(仅使用下划线查看被替换的内容),但它也删除了CR/LF clean_str = Regex.Replace( in_str, "\p{C}+", "_" ) 还尝试: clean_str = Regex.Replace( in_str, "(\p{Cf}|\p{Co}|\p

我试图使用regex(.Net)来“清理”Unicode输入字符串——要求删除除CR(回车)和LF(换行符)之外的所有不可见字符/控制字符。换句话说,保留所有有效的可打印字符(英语和法语),包括CR和LF

我尝试了以下方法(仅使用下划线查看被替换的内容),但它也删除了CR/LF

clean_str = Regex.Replace( in_str, "\p{C}+", "_" )
还尝试:

clean_str = Regex.Replace( in_str, "(\p{Cf}|\p{Co}|\p{Cs}|\p{Cn}|[\x00-\x09]|\x0b|\x0c|[\x0e-\x1f]|\x7f)+", "_" )

如果你有更好/更有效的方法,请发布


提前谢谢

可以使用字符类减法将CR和LF从控制字符类中排除:

clean_str = Regex.Replace( in_str, "[\p{C}-[\r\n]]+", "" )

可以使用字符类减法将CR和LF从控制字符类中排除:

clean_str = Regex.Replace( in_str, "[\p{C}-[\r\n]]+", "" )

作为使用正则表达式的替代方法,您可以只迭代字符串。很抱歉出现伪代码:

for (char c in in_str) {
    if (c < 32) {
        switch (c) {
        default: continue
        case '\n':
        case '\r':
        case 0x7F:
        }
    }
    clean_str.add(c);
}
for(字符c在字符串中){
if(c<32){
开关(c){
默认值:继续
案例“\n”:
案例'\r':
案例0x7F:
}
}
清洁街加(c);
}

作为使用正则表达式的替代方法,您只需迭代字符串即可。很抱歉出现伪代码:

for (char c in in_str) {
    if (c < 32) {
        switch (c) {
        default: continue
        case '\n':
        case '\r':
        case 0x7F:
        }
    }
    clean_str.add(c);
}
for(字符c在字符串中){
if(c<32){
开关(c){
默认值:继续
案例“\n”:
案例'\r':
案例0x7F:
}
}
清洁街加(c);
}

抱歉--不适用于包含方括号或其他特殊可打印字符的字符串--即:[]…是--也适用--谢谢!想知道哪个更快——Regex.Replace()或遍历字符串?这是一个好问题,虽然我怀疑Regex代码会更快,但我认为唯一确定的方法是在不同长度的字符串上对它们进行基准测试。正确-但为了运行有效的测试-我需要知道{C}字符类由(为了构建等价的case语句)组成。在以下位置的Microsoft文档中找不到任何内容:,因此,目前我使用的是正则表达式。浏览它时,Cx GroupsOry中似乎有很多字符——不适用于包含方括号或其他特殊可打印字符的字符串——即:[]……是的——也适用——谢谢!想知道哪个更快——Regex.Replace()或遍历字符串?这是一个好问题,虽然我怀疑Regex代码会更快,但我认为唯一确定的方法是在不同长度的字符串上对它们进行基准测试。正确-但为了运行有效的测试-我需要知道{C}字符类由(为了构建等价的case语句)组成。在以下位置的Microsoft文档中找不到任何内容:,因此,目前我使用的是正则表达式。浏览一下,似乎Cx组中有相当多的字符可能是最简单的——但是ASCII 127(DEL)呢——像这样的代码是不可打印的?我知道--将代码添加到case语句中…可能是最简单的--但是ASCII 127(DEL)呢--像这样的代码是不可打印的?我知道--将代码添加到case语句中。。。