为啥在 C# 的字符串中未检测到“空白”?
Posted
技术标签:
【中文标题】为啥在 C# 的字符串中未检测到“空白”?【英文标题】:Why "White Space" not detected in a string in C#?为什么在 C# 的字符串中未检测到“空白”? 【发布时间】:2014-11-10 07:24:55 【问题描述】:遇到此错误,我感到非常困惑。下面是我正在比较的 2 个字符串,它们在睁开的眼睛中看起来完全一样。但是当我尝试在 C# 代码或 MS Excel 中比较它们时,结果是“不匹配”。
1st: Frillestads_församling_Länsräkenskaper efter 1917. Mantalslängder 1918-1991 Special 99
2nd: Frillestads_församling_Länsräkenskaper efter 1917. Mantalslängder 1918-1991 Special 99
即使我尝试使用单个空格 (' ') 将它们拆分为字符串数组,第一行也没有拆分。
这里是 C# 代码:
private void btnFindMismatch_Click(object sender, EventArgs e)
string value1 = FormattedString(txtFirstValue.Text);
string value2 = FormattedString(txtSecondValue.Text);
bool isMismatchFound = false;
string[] value1Array = value1.Split(new char[] ' ' , StringSplitOptions.RemoveEmptyEntries);
string[] value2Array = value2.Split(new char[] ' ' , StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < value1Array.Length; i++)
if(value1Array[i].Equals(value2Array[i]) == false)
lblResult.Text = string.Format("Mismatch in index: 0; 1st Char: 1; 2nd Char: 2", i, value1Array[i], value2Array[i]);
isMismatchFound = true;
break;
if(!isMismatchFound)
lblResult.Text = "No Mismatch";
MessageBox.Show("Complete");
private string FormattedString(string value)
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"[ ]2,", options);
value = regex.Replace(value, @" ");
return value;
然后我尝试检查 notepad++ 中的第一个值,然后发现第一个字符串不包含任何“空白”。
请查看下面的屏幕截图以获得更清晰的视图。
【问题讨论】:
【参考方案1】:这些似乎不是普通空格 (0x20
),但可能是不可破坏的空格 (0xA0
)。如果您使用通用空格速记 \s
而不是标准空格字符,它应该可以工作。
Regex regex = new Regex(@"\s2,", options); // for example
请注意,\s
也将匹配换行符、制表符和其他空格 - 所以也许你想让正则表达式更具体,具体取决于实际使用的空格字符(Notepad++ 可能有一个十六进制模式,可以让你检查它到底是哪一个):
Regex regex = new Regex(@"[ \xa0]2,", options);
【讨论】:
我尝试了您建议的两个正则表达式,但第一行仍然没有中断并且与之前的相同。 我无法在此处重现 - 您可以检查第一个字符串中“空格”的 ASCII 值吗? Notepad++ 似乎需要plugin 来做到这一点。 当我选择“之后”之前的空格并单击记事本++中的“十六进制”按钮时,它以突出显示的颜色显示“a0”。此外,它在“skaper”和“efter”之间显示了一个 DOT (.),例如 Dump 列下的“skaper.efter”。但是当我选择一个 DOT (.) 并查看它的 HEX 值时,它显示的是“2e”而不是“a0”。我不明白这是什么意思。 @V.P.Verma:在 DUMP 列下显示的点 NP++ 只是为了显示有一个特殊字符而不是普通空格(实际的 ASCII 点具有字符值0x2e
) .所以这些空间实际上是不可破坏的空间。第二个正则表达式 [ \xa0]
应该匹配那些。不要忘记在搜索/替换对话框中打开正则表达式选项。
蒂姆,是的。在 NP++ 中,使用正则表达式“\xa0”,我可以用其他字符替换不可破坏的空格。但是在上面的 C# 代码中,当我使用你的第二个正则表达式时,它仍然没有中断。你能帮我解决这个问题吗?以上是关于为啥在 C# 的字符串中未检测到“空白”?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?
为啥我无法使用 C# 检测到蓝牙 Estimote 信标,但 Windows 操作系统可以找到它们?