在Silverlight中使用多行TextBox(AcceptsReturn =“True”)时,换行符记录为\ r而不是\ r \ n。当数据被持久化并随后导出为另一种格式以供Windows应用程序读取时,这会导致问题。
我正在考虑使用正则表达式用\ r \ n替换任何单个\ r \ n字符,但我在正则表达式中吮吸并且无法使其工作。
因为可能存在混合的行结尾只是盲目地用\ r \ n替换所有\ r \ n不会削减它。
真的有两个问题......
如果正则表达式是正确的模式?
有没有办法让Silverlight在TextBox中尊重它自己的Environment.NewLine字符并让它插入\ r \ n而不只是一个\ r?
答案 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
。
此正则表达式中的花哨运算符被称为环视:(?=...)
是一个积极的前瞻,(?<=...)
是一个积极的外观,(?!...)
是一个负向前瞻,而(?<!...)
是一个负面的背后隐藏。它们中的每一个都是零宽度断言,如^
或$
;如果给定的正则表达式成功/失败(分别为正/负)以匹配字符串中当前位置之后/之前(对于前瞻/后瞻),它们成功匹配而不消耗输入。