我不确定“令牌替换”是否是正确的词组,但这是我正在尝试做的事情:
在字符串中,如果我找到两个或多个连续的空格(\ s)又名 - 空格,新行,制表符等。我想用它自己的一个实例替换它匹配的任何内容。
示例:
a b b
会变成
a b b
和
a
b
c
会变成:
a
b
c
可以使用.net regex完成吗?
答案 0 :(得分:2)
如果你想正确地替换双重换行符和空格,你需要使用它:
string input = @"a
b
c d e";
string result = Regex.Replace(input, @"(\r\n|\s)\1", "$1");
\1
将查找与组(\s|\r\n)
匹配的字符,并且替换字符串中的$1
将仅使用该组的单个实例替换匹配
如果你想用一个实例替换多个副本(即连续3个),你需要使用@"(\r\n|\s)\1+"
作为模式,但副作用是:
a
b
c
将缩减为:
a
b
c
答案 1 :(得分:0)
是的,它可以。使用System.Text.RegularExpressions.Regex.Replace:
string str = "a b b";
Regex rexReplace = new Regex(" +");
str = rexReplace.Replace(str, new MatchEvaluator(delegate(Match match)
{
return " ";
}));
答案 2 :(得分:0)
对于后代,我的解决方案来自this question:
Regex
regex_select_all_multiple_whitespace_chars =
new Regex(@"\s+",RegexOptions.Compiled);
var cleanString=
regex_select_all_multiple_whitespace_chars.Replace(dirtyString.Trim(), " ");
正则表达式不是最好的方法。蛮力方法似乎要快得多。阅读上面的链接......
答案 3 :(得分:0)
string str = "a b c a\r\n\r\nb\r\n\r\nc";
string newstr = Regex.Replace(str, "(\u0200)+", " ");
newstr = Regex.Replace(newstr, "(\t)+", "\t");
newstr = Regex.Replace(newstr, "(\r\n)+", "\r\n");
答案 4 :(得分:0)
使用正则表达式可以实现这一点,但是在添加了多个选项之后它会变得非常有趣。这是正则表达式的一个示例,它只处理空格和制表符。
public static string ShrinkWhitespace(string input)
{
return Regex.Replace(input, @"(((?<t>\s)\s+)|((?<t>\t)\t+))", "${t}");
}
如果将这些方法编码为简单方法,我发现这样的方法更容易理解和维护。例如。
public string ShrinkWhitespace(string input) {
var builder = new StringBuilder();
var i = 0;
while ( i < input.Length ) {
var current = input[i];
builder.Append(current);
switch ( current ) {
case '\t':
case ' ':
case '\n':
i++;
while ( i < input.Length && input[i] == current ) {
i++;
}
break;
default:
i++;
break;
}
}
return builder.ToString();
}