如何处理Silverlight TextBox中的新行字符

时间:2010-06-11 12:13:03

标签: regex silverlight

在Silverlight中使用多行TextBox(AcceptsReturn =“True”)时,换行符记录为\ r而不是\ r \ n。当数据被持久化并随后导出为另一种格式以供Windows应用程序读取时,这会导致问题。

我正在考虑使用正则表达式用\ r \ n替换任何单个\ r \ n字符,但我在正则表达式中吮吸并且无法使其工作。

因为可能存在混合的行结尾只是盲目地用\ r \ n替换所有\ r \ n不会削减它。

真的有两个问题......

如果正则表达式是正确的模式?

有没有办法让Silverlight在TextBox中尊重它自己的Environment.NewLine字符并让它插入\ r \ n而不只是一个\ r?

2 个答案:

答案 0 :(得分:4)

我根本不知道Silverlight(我发现你描述的行为很奇怪),但也许你可以尝试搜索\r(?!\n)并用\r\n替换它。

\r(?!\n)表示“匹配\r当且仅当\n后面没有”。

如果您恰好\n之前没有\r,并希望对其进行“规范化”,那么请搜索\r(?!\n)|(?<!\r)\n并替换为\r\n

(?<!\r)\n表示“匹配\n当且仅当\r之前没有”。

答案 1 :(得分:4)

我不知道Silverlight,但我想(我希望!)有一种方法可以让它尊重Environment.NewLine - 这将是一种更好的方法。但是,如果没有,则可以使用正则表达式。我假设您的文字包含\r\n\r\n的所有内容,并且从不将其用作行结尾的任何内容 - 您只需要一致性。 (如果它们显示为非行结束数据,则正则表达式解决方案变得更加困难,并且可能不可能。)因此,您希望将所有出现的\r(?!\n)|(?<!\r)\n替换为\r\n。第一个正则表达式的前半部分与\r匹配任何\n 未跟随;后半部分与单独\n匹配,前面没有\r

此正则表达式中的花哨运算符被称为环视(?=...)是一个积极的前瞻,(?<=...)是一个积极的外观,(?!...)是一个负向前瞻,而(?<!...)是一个负面的背后隐藏。它们中的每一个都是零宽度断言,如^$;如果给定的正则表达式成功/失败(分别为正/负)以匹配字符串中当前位置之后/之前(对于前瞻/后瞻),它们成功匹配而不消耗输入。