构建一个正则表达式,如何删除多余的换行符?

时间:2012-07-29 16:39:30

标签: c# regex

我有一个像这样的字符串

"a           a            a  a aaa b c d e f a g a aaa  aa           a       a"

我想把它变成

"a b c d e f a g a"

"a                        b c d e f a g a                   "

(无论哪个更容易,因为它都是HTML而无关紧要)

"a"是换行符(\r\n),以防万一。

5 个答案:

答案 0 :(得分:1)

通常您的代码应为:

s.replace(new RegExp("(\\S)(?:\\s*\\1)+","g"), "$1"); 

检查this小提琴。

但是,取决于那些字符 a b c ,......代表你的案例/问题,您可能需要将\\S更改为其他类,例如[^ ],然后\\s更改为[ ],如果您想要包含 \ r 并且 \ n 也可以折叠>>

s.replace(new RegExp("([^ ])(?:[ ]*\\1)+","g"), "$1");

检查this小提琴。

但是,如果 a 代表字符串 \ r \ n ,那么您需要更复杂的模式>>

s.replace(new RegExp("(\\r\\n|\\S)(?:[^\\S\\r\\n]*\\1)+","g"), "$1");

检查this小提琴。

答案 1 :(得分:0)

如果我正确理解了问题,目标是删除特定字符/字符串的重复副本,可能用空格分隔。您可以将正则表达式(a\s*)+替换为来执行此操作; +用于多个连续副本,a\s*用于a s后跟空格你做得多精确取决于语言:在Perl中它是$str =~ s/(a\s*)+/a /g,在Ruby中{{1}等等。

事实str.gsub(/(a\s*)+/, "a ")实际上a 不应该使事情复杂化,但可能意味着替换会更好地作为\r\n(从{{{ 1}}与s/(\r\n[ \t]*)+/\r\n/g\s)重叠。

答案 2 :(得分:0)

如果您需要C#代码,并且想要使用前导和尾随空格折叠 JUST \ r \ n字符串,那么解决方案非常简单:

string result = Regex.Replace(input, @"\s*\r\n\s*", "\r\n");

检查此代码here

答案 3 :(得分:0)

走了这个:

private string GetDescriptionFor(HtmlDocument document)
{
    string description = CrawlUsingMetadata(XPath.ResourceDescription, document);
    Regex regex = new Regex(@"(\r\n(?:[ ])*|\n(?:[ ])*){3,}", RegexOptions.Multiline | RegexOptions.IgnoreCase);//(?:[^\S\r\n|\n]*\1)+

    string result = regex.Replace(description, "\n\n");
    string decoded = HttpUtility.HtmlDecode(result);
    return decoded;
}

它应该忽略所有换行符,除非它匹配三个或更多连续换行符,忽略空格,并用\n\n替换这些匹配。

答案 4 :(得分:-1)

试试这个:

Regex.Replace(inputString, @"(\r\n\s+)", " ");