关于c#:Regex。通过分隔符将字符串拆分为子字符串,同时保留空白

Regex.Split string into substrings by a delimiter while preserving whitespace

我创建了一个正则表达式以用定界符($)分割字符串,但是它不能按我想要的方式工作。

1
2
3
4
5
6
7
var str ="sfdd fgjhk fguh      $turn.bak.orm $hahr*____f";
var list = Regex.Split(str, @"(\\$\\w+)").Where(x => !string.IsNullOrEmpty(x)).ToList();

foreach (var item in list)
{
    Console.WriteLine(item);
}

输出:

1
2
3
4
5
"sfdd fgjhk fguh     "
"$turn"
".bak.orm"
"$hahr"
"*____f"

问题是\\w+与任何句点或星号都不匹配。这是我想要的输出:

1
2
3
4
"sfdd fgjhk fguh     "
"$turn.bak.orm"
""
"$hahr*____f"

本质上,我想用$分割字符串,并确保$出现在子字符串的开头,并且没有其他地方(子字符串只可以是$是可以的)。我还想确保将空格字符保留在第一个子字符串中,但任何匹配项都不应像在第二和第四种情况中那样包含空格。我不在乎大小写。


您似乎想使用以美元开头的模式进行拆分,然后使用除空格和美元字符以外的0个或多个字符:

1
2
3
var list = Regex.Split(s, @"(\\$[^\\s$]*)")
        .Where(x => !string.IsNullOrEmpty(x))
        .ToList();

详细信息

  • (-捕获组的开始(以便Regex.Split标记化字符串,可以将匹配项保留在结果数组中)

    • \\$-美元符号
    • [^\\s$]*-否定字符类,匹配除空格(\\s)和美元符号以外的0个或更多字符
  • )-捕获组的末尾。

请参阅正则表达式演示:

enter