2012-07-29 190 views
0

我有这样构建正则表达式,如何去除多余的换行符?

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

+1

你在用什么语言? – 2012-07-29 16:50:55

+0

哎呀,更新了这个问题。 'C#',谢谢。 – bevacqua 2012-07-29 17:00:28

+0

为什么这会降低投票率? – bevacqua 2012-07-29 17:16:58

回答

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取代那些比赛。

1

一般来说你的代码应该是:

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

检查this小提琴。

但是,要看是什么这些字符一个bç,...代表你的情况/问题,您可能需要更改\\S到其他类,如[^ ],然后\\s[ ],如果要包括\ r\ n到被倒塌以及>>

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

检查this小提琴。

但是,如果一个是要代表字符串\ r \ n,那么你就需要一些更复杂的模式>>

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

检查this小提琴。

+0

当OP的问题没有** C#**标签,只是** html **和** regex **,所以我带** javascript **解决方案来发布我的回复。正则表达式模式对C#来说是一样的,所以你应该能够轻松地克隆它... – 2012-07-29 17:09:59

+0

对于OP:C#regex比JS正则表达式更强大。你可以避开字符串转义序列,并在C#中输入一个文字字符串。 – nhahtdh 2012-07-29 17:12:41

+0

@nhahtdh - 随时编辑我的答案。 – 2012-07-29 17:13:39

0

如果我正确理解问题,目标是删除特定字符/字符串的重复副本,可能由空格分隔。你可以通过用替换正则表达式(a\s*)+来实现; +多个连续副本,a\s*a s后跟空格你的确切程度取决于语言:在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重叠)。

-1

试试这个:

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

Ria,你的代码会删除每个'\ r \ n',这不是OP所要求的! – 2012-07-29 17:30:07

0

如果你需要的C#代码,并要折叠JUST \ r \ n,其中前导和尾部空格的字符串,则该解决方案很简单:

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

检查此密码here

+0

我也想删除相邻的'\ r \ n's并用一个'\ r \ n'代替它们。 – bevacqua 2012-07-29 17:31:41

+0

@Nice - 这就是**正好**上面的代码正在做什么,对吗?你应该知道'\ r'和'\ n'也是空白字符...... – 2012-07-29 17:33:46

相关问题