【问题标题】:Can't replace single whitespace with string.Replace()不能用 string.Replace() 替换单个空格
【发布时间】:2016-04-30 17:01:39
【问题描述】:

我遇到了一个我不明白的问题。我正在从文件中读取数据并且遇到了这样一种情况:文件中的条目上的string.Replace(" ", "<whatever>") 不会替换单个空格的出现。我不禁感到我错过了一些非常基本的东西,因为声明为文字的相同类型的字符串可以正常工作。

文件中的典型行(每个条目由制表符分隔):

“2016-feb-08 09:54:00”“2016-feb-08 17:28:00”“短”“227”“5 170,00”“+3,90%”“0,00 "

使用File.ReadAllLines().Split(new[] {"\t" }, StringSplitOptions.None); 将文件中的数据读入一个数组。

然后我想清理第五个条目以进行进一步处理,这就是我遇到问题的时候: entries[4].Replace(" ", string.Empty).Replace("\"", string.Empty); 给出“5 170,00” Regex.Replace(entries[4], @"\s+", string.Empty).Replace("\"", string.Empty); 给出“5170,00”,这是我正在寻找的结果。

在带有单个空格的文字上运行第一个 Replace() 效果很好,所以我很好奇文件中字符串中的空格是否有所不同?虽然 Regex 解决方案有效,但我真的很想知道我的“问题”是什么。

【问题讨论】:

  • 你能在这里发布以下命令的结果吗:string x = string.Join(string.Empty, Encoding.UTF8.GetBytes(entries[4]).Select(b => b.ToString("x2")))?
  • @UlugbekUmirov 命令的结果是“2235c2a03137302c303022”。
  • 也许你应该清理并重建你的解决方案。
  • 51 之间有NO-BREAK SPACE (0xc2 0xa0) 符号。正则表达式 \s 匹配它。但是如果你想使用string.Replace,那么你必须像entries[4].Replace("\u00a0", string.Empty)一样使用它。

标签: c# regex string replace


【解决方案1】:

您可以使用如下代码来检查字符的十六进制值。正常的空格是 0x20,在您发布的代码中显示的值介于 5 和 1 之间。

            string input = "2016-feb-08 09:54:00 2016-feb-08 17:28:00 Short 227 5 170,00 +3,90% 0,00";
            byte[] output = Encoding.UTF8.GetBytes(input);

【讨论】:

  • fitth条目的字节显示“5”和“1”之间有两个字符; “”和“''”。我想我需要回答的问题是,那些是如何进入那里而不是一个空格的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2015-08-05
  • 2013-11-25
  • 2018-08-05
  • 2013-01-04
  • 2011-05-20
相关资源
最近更新 更多