C# - 如何使用正则表达式替换空字符?

3

我有以下字符串:

< \0\"\0E\0x\0t\0e\0n\0s\0i\0b\0i\0l\0i\0t\0y\0,\0v\0e\0r\0s\0i\0o\0n\0=\0\\\0\"\07\0.\00\0.\03\03\00\00\0.\00\0\\\0\"\0,\0p\0u\0b\0l\0i\0c\0K\0e\0y\0T\0o\0k\0e\0n\0=\0\\\0\"\0B\00\03\0F\05\0F\07\0F\01\01\0D\05\00\0A\03\0A\0\\\0\"\0,\0f\0i\0l\0e\0V\0e\0r\0s\0i\0o\0n\0=\0\\\0\"\07\0.\00\0.\09\04\06\06\0.\01\0\\\0\"\0,\0c\0u\0l\0t\0u\0r\0e\0=\0\\\0\"\0n\0e\0u\0t\0r\0a\0l\0\\\0\"\0\"\0=\0h\0e\0x\0(\07\0)\0:\07\08\0,\0\\\0"

在Notepad++中看起来像这样:

enter image description here

我想使用正则表达式替换所有的“NULL”实例,但似乎无法得到正确的搜索模式。这是我的代码:

        FileInfo file = new FileInfo(path);
        string line;
        using (StreamReader reader = new StreamReader(file.FullName))
        {
            while ((line = reader.ReadLine()) != null)
            {
                Regex rgx = new Regex(@"^[\00|\0]");
                line = rgx.Replace(line, "");

                System.Console.WriteLine(line);
                CurrentLine++;
            }
        }

然而,这似乎没有替换任何文本。这种情况下的正确搜索模式是什么?
4个回答

3
你不需要使用正则表达式,可以用String.Replace()函数:
line = line.Replace("\u0000", "");

3
你的正则表达式存在问题,其中的^字符意味着你的正则表达式只会在字符串的开头查找NULL字符。去掉它,你的代码就能正常工作了。

好的,这个方法奏效了。谢谢! Regex.Replace(line, @"[\0|\00]", ""); 或者 Regex rgx = new Regex(@"[\00|\0]"); - Hooplator15
很高兴我能帮到你。祝编码愉快 :) - Nasreddine

1

如果您只想替换空字符,您可以使用String.Replace

line = line.Replace("\0", "");

0

感谢已有的回答,让你的代码已经能够正常工作了。另外有人已经指出,在这种情况下并不需要使用正则表达式。本答案是关于如何改进你的正则表达式模式。

在.NET正则表达式模式中,有几种指定特殊字符的方法,如文档所示。

以下是指定空字符的文档化方式:

  • @"\00" - ASCII八进制0(2位数字)
  • @"\000" - ASCII八进制0(3位数字)
  • @"\x00" - ASCII十六进制0
  • @"\u0000" - UTF-16十六进制0

根据我的测试,以下这些未经记录的方法也可以工作:

  • @"\0"(正则表达式测试工具如regex101.com将其标记为模式错误)
  • "\0"(将实际的特殊字符混合到模式中似乎是不好的做法)

因此,您代码中的完整模式可以只是@"\x00"或上面提到的其他选项之一。

这里是您实际模式的解释:@"[\00|\0]"。我删除了^,因为它已经被讨论过了。

  • []是一个字符集,因此它将匹配括号内的任何字符
  • \00是空字符
  • |只是|。也许您想使用它表示“或”,但在括号内时它并不意味着那个。
  • \0再次是空字符

因此,@"[\00|\0]"的意思是“匹配一个(空或|或空)。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接