Match.Value和国际字符

6
更新:本文可能对使用RichTextBox的程序员有所帮助。正则表达式对于普通字符串是正确的,但我没有注意到“ä”在richTextBox.Rtf中转换为“\e4r”!因此Match.Value是正确的 - 是人为错误。
正则表达式可以找到正确的文本,但Match.Value是错误的,因为它用“\'e4”替换了德语中的“ä”!
让我们以"Primär-ABC"为例,使用以下代码:
String example_text = "<em>Primär-ABC</em>";
Regex em = new Regex(@"<em>[^<]*</em>" );
Match emMatch = em.Match(example_text); //Works!
Match emMatch = em.Match(richtextBox.RTF); //Fails!
while (emMatch.Success)
{
  string matchValue = emMatch.Value;
  Foo(matchValue) ...
}

然后emMatch.Value返回的是“Prim\'e4r-ABC”,而不是“Primär-ABC”。

德语中的ä会转换为\'e4!因为我想使用确切的字符串,所以我需要emMatch.Value成为Primär-ABC - 我该如何实现?


代码看起来不错,但是:1. 你怎么知道emMatch.Value的值是\e4?你打印了吗?2. 能否以同样的方式显示example_text的值,并确保它不包含\e4 - ie.
哦!!!非常抱歉!RTF文件包含“\ e4”,但是后来显示为“ä”。 - user1338270
1个回答

2
你是在什么背景下进行这项工作?
string example_text = "<em>Ich bin ein Bärliner</em>";
Regex em = new Regex(@"<em>[^<]*</em>" );
Match emMatch = em.Match(example_text);
while (emMatch.Success)
{
    Console.WriteLine(emMatch.Value);
    emMatch = emMatch.NextMatch();
}

这个代码会在我的控制台中输出<em>Ich bin ein Bärliner</em>

问题可能不是你得到了错误的,而是你得到的值的表示方式不正确。这取决于很多因素。尝试使用UTF8编码将该值写入文本文件并查看是否仍然不正确。

编辑:对了。问题在于您正在使用Rtf属性从WinForms RichTextBox获取文本。这不会返回文本,而是返回文本的RTF表示形式。RTF不是纯文本,它是一种显示丰富文本的标记格式。如果您在例如记事本中打开RTF文档,则会看到其中有许多奇怪的代码-包括您的RTF文档中每个'ä'的\'e4。如果您在RTF框中使用了某些标记(如粗体文本、颜色等),.Rtf属性也将返回该代码,看起来类似于{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf6\insrsid15946317\charrsid15946317 test}

因此,请改用.Text属性。它将返回实际的纯文本。


哦,非常好的问题和例子!适用于普通字符串!背景是我的代码实际上看起来像这样Match emMatch = em.Match(richTextBox.Rtf)因为我想用黄色(Textmarker)突出显示所有用<em>标签包围的文本并删除这些标签。 - user1338270
你尝试过完成操作吗?即使匹配输出看起来不对,它可能仍然有效。我对RichTextBox不是很熟悉。这是WinForms吗? - Anders Arpi
这是使用 .Net 2.0 的 Winforms :-( 不幸的是它不起作用,文本没有被替换。但至少我现在有了一个新的方向 - 我没有考虑使用普通字符串作为测试,呃!请参见上面的答案。 - user1338270
尝试使用richTextBox.Text而非richTextBox.Rtf。至少对我来说这样可以解决问题。但是,这取决于之后你将用它来做什么。RTF不好玩哦 :) - Anders Arpi

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