为啥在 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# 的字符串中未检测到“空白”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 没有检测到 1970/1/1 在 BST 下?

为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?

c#处理空白字符

为啥我无法使用 C# 检测到蓝牙 Estimote 信标,但 Windows 操作系统可以找到它们?

为啥 C# 中的数字格式字符串在不使用小数 (F0) 时会将数字四舍五入?

在存储的**过程**中检测到相同的错误,但在存储的**函数**中未检测到