regex 如何使用正则表达式替换NULL字符?

8oomwypt  于 2023-01-18  发布在  其他
关注(0)|答案(4)|浏览(245)

我有以下字符串:

< \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"

在记事本++中,它看起来像这样:

我想用正则表达式替换所有“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++;
            }
        }

但是,这似乎没有替换任何文本。正确的搜索模式是什么?

vi4fp9gy

vi4fp9gy1#

你的正则表达式的问题是^字符,这意味着你的正则表达式只会在字符串的开头寻找NULL字符,去掉它,你的代码就会正常工作。

bvjxkvbb

bvjxkvbb2#

你不需要正则表达式,你可以使用String.Replace()

line = line.Replace("\u0000", "");
2nbm6dog

2nbm6dog3#

如果您只想替换空字符,那么您不能使用String.Replace

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

lvmkulzt4#

由于这个答案已经被接受,你的代码已经可以工作了,而且有人已经指出,regex在第一个地方是不需要的,这个答案是关于改进你的regex模式的。
有几种方法可以在.NET正则表达式模式中指定特殊字符,如documentation中所示。
以下是指定空字符的方法:

  • @"\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]"表示“匹配一个(空或|或空)”。

相关问题