字符串比较、.NET和不间断空格

17

我有一个用C#编写的应用程序,它进行了大量的字符串比较。这些字符串来自各种来源(包括用户输入),然后进行比较。 但是当将空格“32”与不间断空格“160”进行比较时,我遇到了问题。 对于用户来说,它们看起来相同,因此他们期望匹配。但是当应用程序进行比较时,没有匹配。

最好的解决方法是什么? 我是否必须去到所有进行字符串比较的代码部分,并手动将非间断空格规范化为空格? .NET提供了任何帮助吗? (我尝试了所有的比较选项,但似乎都没有帮助。)

建议我在接收字符串时对其进行规范化,然后让字符串比较方法仅比较规范化的字符串。 我不确定这样做是否直接。 首先,规范化的字符串是什么。 我该如何规范化它呢? 当然,现在我可以将非间断空格转换为空格。 但是还会出现什么情况? 可能会有很多这样的规则吗? 它们可能甚至是互相矛盾的。(在某些情况下,我想使用规则,在其他情况下,我不想使用规则。)


您可以编辑自己的问题以添加更多信息或提供澄清。 - Jim Mischel
5个回答

41

我花了很多时间才找到这个简单的答案。下面的代码使用正则表达式将不间断空格替换为普通空格。

string cellText = "String with non breaking spaces.";
cellText = Regex.Replace(cellText, @"\u00A0", " ");

希望这可以帮到你,Dan


12
@符号不会阻止转义字符起作用吗?应该用cellText.Replace("\u00A0", " "),对吗? - jpmcclung
9
是的,请参阅 http://msdn.microsoft.com/en-us/library/system.string.aspx 中的“Char Objects and Unicode Characters”。此外,cellText.Replace('\u00A0', ' ') 的速度更快(http://www.dotnetperls.com/replace-performance)。 - Arithmomaniac
2
FYI - cellText.Replace(@"\u00A0", " ") 没有起作用。Regex.Replace(cellText, @"\u00A0", " "); 似乎是正确的方法。 - gpmurthy
@DavidSchmitt 这对我没用(vb.net)- 但是 Regex.Replace 有用。 - Ian Grainger
@gpmurthy 记住,字符串是不可变的,所以完整的代码行需要是 cellText = cellText.Replace('\u00A0', ' '); - Timothy
1
@符号不会阻止转义工作,但String.Regex将在运行时处理转义,而String.Replace则不会。 3个有效的方法:(1)Regex.Replace(cellText,@"\ u00A0"," ")(2)Regex.Replace(cellText,"\ u00A0"," ")(3)cellText.Replace('\ u00A0',' ')不起作用的方法:cellText.Replace(@ "\ u00A0"," "); - Alexander Taylor

13

需要它

text.Replace('\u00A0',' ')

\u00A0 是不间断空格。

这将把不间断空格替换为普通空格。


这个可行,避免使用正则表达式。虽然性能差异可能可以忽略不计。 - Lionet Chen

10
如果是我,我会在“导入”字符串时使用string.Replace()将其“标准化”,这样就不需要在其他任何地方更改比较了。
编辑:马克,这很难。什么是“标准化”的字符串,真的取决于您或您的客户。我曾经遇到过类似的情况,客户要求像“我有4个苹果。”和“我有四个苹果。”这样的字符串实际上相等。您可能需要为不同的情况使用不同的规范化器。无论如何,我仍然会在检索原始字符串时进行规范化。

是的,我会使用自己的函数将字符串规范化为您关心的内容,该函数调用string.Replace然后进行比较。 - NoahD
各位,我该如何发布跟进问题或澄清问题以回应这个提出的答案?我在这里发吗?但是这里只允许255个字符。 - Mark
@Mark:请编辑您的问题以包括后续问题或澄清。 - Mia Clarke
哈哈,谢谢 - 例子比较 (4 == four) 让我笑了,但也让我思考“相等”的定义应该是什么。也许我们需要一个 string.Equivalent() 方法。 - joelsand

2

我建议创建一个扩展原始字符串比较器的自定义字符串比较器,将“标准化”过程放在那里(用普通空格替换不间断空格)。除了实例Equals方法外,还有一个接受比较器的静态String.Equals方法。


-1

没有正则表达式的相同代码,主要是为了以后自己需要时使用:

text.Replace('\u00A0', ' ')


您给出的表达式顺序错误,正确的应该是 text.Replace('\u00A0',' ')。 - Gaurravs
@Gaurravs 确实如此。我需要另一个方向,因此犯了错误。 - John

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