我有一个这样的字符串
"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"s 是换行符 ( \r\n),以防发生任何变化。
通常你的代码应该是:
s.replace(new RegExp("(\\S)(?:\\s*\\1)+","g"), "$1"); 
检查这个小提琴。
但是,取决于这些字符a、b、c、 ... 在您的案例/问题中代表什么,您可能需要更改\\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");
检查这个小提琴。
带着这个去:
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.
如果我正确理解问题,目标是删除特定字符/字符串的重复副本,可能用空格分隔。您可以通过将正则表达式替换(a\s*)+为a ; +对于多个连续副本,a\s*对于as 后跟空格,您执行该操作的精确程度取决于语言:在 Perl 中它是$str =~ s/(a\s*)+/a /g,在 Ruby 中它是str.gsub(/(a\s*)+/, "a "),等等。
事实上ais 实际上\r\n 不应该使事情复杂化,但可能意味着替换会更好地工作s/(\r\n[ \t]*)+/\r\n/g(因为与and\s重叠)。\r\n
如果您需要 C# 代码并且想要折叠带有前导和尾随空格的JUST \r\n 字符串,那么解决方案非常简单:
string result = Regex.Replace(input, @"\s*\r\n\s*", "\r\n");
在此处检查此代码。
试试这个:
Regex.Replace(inputString, @"(\r\n\s+)", " ");