繁体   English   中英

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

[英]Building a regex, how to remove redundant line breaks?

我有这样的字符串

"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 ),以防万一。

通常,您的代码应为:

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

检查这个小提琴。

但是,根据您的案例/问题中的那些字符abc ,...,您可能需要将\\\\S更改为其他类,例如[^ ] ,然后将\\\\s更改为[ ] ,如果您还想将\\ r\\ n也包含在内,请>>

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

检查这个小提琴。

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

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

检查这个小提琴。

如果我正确理解问题,则目标是删除特定字符/字符串的重复副本,可能用空格分隔。 您可以通过将正则表达式(a\\s*)+替换a ;来实现。 +多个连续拷贝, a\\s*a秒,然后用空格怎么正是你做到这一点取决于语言:在Perl是$str =~ s/(a\\s*)+/a /g ,在Ruby中它的str.gsub(/(a\\s*)+/, "a ")等。

a实际上是\\r\\n的事实不应该使事情复杂化,但可能意味着,替换为s/(\\r\\n[ \\t]*)+/\\r\\n/g更好(因为\\s\\r\\n重叠。

如果您需要C#代码,并且想用开头和结尾的空格折叠\\ r \\ n字符串,则解决方案非常简单:

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

在此处检查此代码。

与此:

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替换那些匹配项。

试试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM