我希望在用C#编写的Visual Studio 2013扩展中使用正则表达式。
我试图在保留空行的同时从一行删除尾随空格。我也想删除多个空行。应保留现有的行结尾(通常是回车换行)。
所以下面的文字(显示为下划线的空格):
hello_world__
___hello_world_
__
__
hello_world
会变成:
hello_world
___hello_world
hello_world
我尝试了许多不同的模式来删除尾随空格,但我最终没有匹配尾随空格或丢失回车符。我还没有尝试删除多个空行。
以下是我迄今为止尝试过的几种模式:
\s+$
(?<=\S)\s+$
答案 0 :(得分:1)
使用
删除多个空白行和尾随空格(?:\r\n[\s-[\rn]]*){3,}
并替换为\r\n\r\n
。
请参阅demo
要删除剩余的空格,可以使用
(?m)[\s-[\r]]+\r?$
请参阅demo 2
答案 1 :(得分:1)
\ +(?=(\n|$))
任意数量的空格,并在换行符或行结束后检查(字符串/文本中的最后一个字符)。 (当然需要启用多行和全局模式)
答案 2 :(得分:1)
感谢目前为止的答案。它们都不适合我需要的东西,但它们帮助我提出了我需要的东西。我认为问题在于VS2013中的正则表达式有些奇怪(见Using Regular Expressions in Visual Studio)。这两项操作对我有用:
将\ +(?=(\n|\r?$))
替换为空。
将^\r?$(\n|\r\n){2,}
替换为\r\n
。
答案 3 :(得分:1)
就像没有使用正则表达式一样,你可以随时将文档拆分为行尾标记,然后使用TrimEnd
进行反馈(正如Anton Semenov所强调的那样)......
(假设文本文档被读成字符串......)
// Ascertain the linefeed...
string str = "This is a test \r\nto see if I can force \ra string to be broken \non multiple lines \r\n into an array.";
string[] t = str.Split(new string[] { "\r\n", "\r", "\n" } ,StringSplitOptions.RemoveEmptyEntries);
thediv.InnerHtml = str + "<br /><br />";
foreach(string s in t)
{
thediv.InnerHtml += s.TrimEnd() + "<br />";
}
我根本没有计时,但如果你更愿意避免使用正则表达式的复杂功能(如果可以的话,我会这样做 - 见下文*),你应该找到足够快的速度来做你想做的事。
*如果可以,我会避免正则表达式。这并不意味着我不使用它。 Regex有它的位置,但我相信它是涉及工作的最后手段工具,例如符合格式的复杂灵活字符串 - 替代方案将生成大量代码。将正则表达式保持在绝对最小值有助于提高代码的可读性。
答案 4 :(得分:0)
\s
包含换行符,我只会搜索多个空格。我不知道VS的细节,但希望这样做:
[" "]*?$
答案 5 :(得分:0)
作为单独的操作 -
删除任何(?m)[^\S\r\n]+$
的尾随空格
删除带有文本(?m)(?<=\S)[^\S\r\n]+$
删除重复的空行(以及空格修剪)
# Find: (?>\A(?:[^\S\r\n]*\r\n)+)|(?>\r\n(?:[^\S\r\n]*(\r\n)){2,})
# Replace: $1\r\n
(?>
\A
(?: [^\S\r\n]* \r \n )+
)
|
(?>
\r \n
(?:
[^\S\r\n]*
( \r \n ) # (1)
){2,}
)