【问题标题】:Parsing the same string gives two different values解析相同的字符串会给出两个不同的值
【发布时间】:2015-08-12 13:06:31
【问题描述】:

我正在尝试解析一个字符串并从中删除“表情符号”并保留新行。

所以,我有这段代码:

string text = "S H A V A . Est 2015\nBandung\nLine: @ubm5921j\nBbm: 7D2E6310\nFAST ORDER\ud83d\udc47\ud83c\udffe\ud83d\udc47\ud83c\udffe";
MessageBox.Show(text);
string result = Regex.Replace(text, @"\p{Cs}", "");

这里'text'的输出如下:

因此,您可以看到新行运行良好,并且它的末尾有“表情符号”,而下一行则完美地删除了它们。所以结果字符串将包含相同的字符串,但没有换行符。

在程序的另一部分我有这段代码。

//uu.description is the same string as above 'text', 
//this is where I scrape directly from html
string text2 = uu.description; 
MessageBox.Show(text2);
string result2 = Regex.Replace(text2, @"\p{Cs}", "");

正如您在本例中看到的那样,我的 text2 以原样输出格式的字符串,而正则表达式完全没有任何作用。新行不起作用,表情符号也不会被删除。

我很困惑为什么它在我的第一种情况下有效,而在第二种情况下无效。我已经研究了好几个小时了,还是搞不明白。

【问题讨论】:

  • 尝试string text2 = Regex.Unescape(uu.description); 并将字符替换为@"\p{Cs}"。或者检查抓取代码:你会在某个时候得到所有字符的转义。请显示 HTML 抓取代码。
  • string text2 = HttpUtility.HtmlDecode(uu.description);
  • string text2 = WebUtility.HtmlDecode(uu.description); 如果您使用 .NET 4.0 及更高版本
  • @stribizhev 抓取代码有点长,无法显示。基本上,我有一个 Web 客户端,我使用 requestString() 下载页面,然后将其从那里刮掉。我试过string lmao = Regex.Unescape(uu.description); 然后lmao = Regex.Replace(testz, @"\p{Cs}", ""); 但结果相同
  • 你已经获得了学分,顺其自然。下次请告知建议的解决方案是否适合您,并感谢获得该解决方案的人。

标签: c# regex string


【解决方案1】:

我已经解决了。我的固定代码如下所示:

string text2 = uu.description;
string result2 = Regex.Replace(Regex.Unescape(text2), @"\p{Cs}", "");

由于某种原因,解析后的字符串带有一个额外的\,看起来像这样\\n。我要感谢@stribizhev 的想法!谢谢。

【讨论】:

    【解决方案2】:

    试试看

               string text = "S H A V A . Est 2015\nBandung\nLine: @ubm5921j\nBbm: 7D2E6310\nFAST ORDER\ud83d\udc47\ud83c\udffe\ud83d\udc47\ud83c\udffe";
                string output = string.Join("",text.Select(x => Encoding.Unicode.GetBytes(new char[] { x })).Select(y => (y[1] << 8) + y[0]).Where(y => y < 256).Select(z => ((char)z).ToString()));
    ​
    

    代码输出

    S H A V A . Est 2015
    Bandung
    Line: @ubm5921j
    Bbm: 7D2E6310
    FAST ORDER​
    

    【讨论】:

    • 这是做什么的?它提供与文本相同的输出。
    • 我将字符串 charactedrs 转换为 int[],这样我就可以测试一个字符是 = 256 (Unicode) 并删除所有字符 >=256。然后转换回字符串。
    • 我明白了。我的目标是保留新行并仅删除表情符号。所以 \n 必须留在字符串中。而且,我认为问题在于新行不起作用,它们显示为普通字母,而不是新行。
    • 我没有在我的代码中更改 '\n'。新行在 Windows 中工作。您可以通过将字符串粘贴到记事本来验证 '\n' 是否正常工作。我在答案中添加了实际结果。
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多