嗨,谢谢阅读。 我遇到Foreach循环问题。
从我可以看到,foreach输出在所有阶段都进行了一次。
这是我的问题的一个例子。
string[] substrings = Regex.Split(Input, splitPattern);
foreach (string match in substrings)
{
Console.WriteLine("'{0}'" , match + "this is first match ") ;
}
输出是:
match 1
match 2
match 3
this is first match
问题1我的问题是“"这是第一场比赛"在所有比赛后显示,而不是在每场比赛后显示。 我想单独操纵每场比赛。因为而不是写作线,我将把每个匹配的值分配给一个对象,所以如果我有5个匹配意味着5个对象。
问题2:如何处理每个匹配的分隔(有或没有foreach循环)。
谢谢
答案 0 :(得分:0)
如果您需要使用Regex.Split
,则需要定义一个模式(我看到您使用的是伪造的xxx
),然后使用Regex.Split
,并注意此功能很可能在连续的分隔符之间和字符串的开头返回空值。修剪可以使用一些LINQ:.Where(p => !string.IsNullOrWhiteSpace(p))
来完成。这个Where
将迭代IEnumarable集合中的所有元素,并检查元素是否为空或只是空格。如果元素仅为null或仅为空格,则将从结果中丢弃该元素。 .ToList()
会将IEnumerable转换为字符串列表(List<string>
)。
因此,在运行Regex.Split
之后,从空字符串中删除结果。
@""
是verbatim string literal。在其中,所有反斜杠(和转义序列)都被视为文字(@"\n"
是一个包含2个字符\
和n
的字符串,而不是换行符号)。写@"\s+"
以匹配1个或更多空格而非"\\s+"
非常方便。
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var line = "xxx abcdef abcdef xxx zxcvbn zxcvbn xxx poiuy poiuy";
var splts = Regex.Split(line, @"xxx").Where(p => !string.IsNullOrWhiteSpace(p)).ToList();
//Console.WriteLine(splts.Count()); // => 3
foreach (string match in splts)
{
Console.WriteLine("'{0}'" , match);
}
}
输出:
' abcdef abcdef '
' zxcvbn zxcvbn '
' poiuy poiuy'