循环中使用正则表达式匹配出现问题

3

你好,感谢阅读。我在使用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循环)。
谢谢。

5
很有可能你的分割模式不正确,只能匹配跨越三行的一个匹配项(匹配项1-3加上换行符)。请发布您的输入数据以及分割模式。 - Christoph
模式:是xxx。 输入数据: xxx abcdef abcdefxxx zxcvbn zxcvbnxxx poiuy poiuy . - abdo refky
  1. Programming is a valuable skill to have in today's job market.
  2. Learning to code can be challenging, but also very rewarding.
  3. There are many different programming languages to choose from, each with their own strengths and weaknesses.
Translated text:
  1. 编程是当今就业市场中具有价值的技能。
  2. 学习编码可能会很具有挑战性,但也非常有回报。
  3. 有许多不同的编程语言可供选择,每种语言都有其自身的优点和缺点。
- abdo refky
如果我知道第二个问题的答案,那么我就会知道是分割还是foreach打印机制出了问题。 - abdo refky
看一下这个正则表达式演示,它是否返回你需要的部分? - Wiktor Stribiżew
显示剩余2条评论
1个回答

0

如果您需要使用Regex.Split,您需要定义一个模式(我看到您正在使用一个假的xxx),然后使用Regex.Split,请注意,此函数可能会在连续分隔符之间和字符串开头返回空值。这可以通过一些LINQ进行修剪:.Where(p => !string.IsNullOrWhiteSpace(p))。这个Where将遍历IEnumarable集合中的所有元素,并检查元素是否为null或仅为空格。如果元素为null或仅为空格,则将其从结果中丢弃。.ToList()将把IEnumerable转换为字符串列表(List<string>)。

因此,在运行Regex.Split之后,修剪结果中的空字符串。

@"" 是一种文字字面量。在其中,所有反斜杠(和转义序列)都被视为文本字面量(@"\n" 是一个包含2个字符的字符串,即\n,不是换行符号)。写@"\s+""\\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'

如果可以的话,我想知道".Where(p => !string.IsNullOrWhiteSpace(p)).ToList();"这句代码的含义以及为什么在分隔符上使用了@。除了这些,我已经做了相同的事情,只是问了一下。 - abdo refky
我在答案中添加了更多细节。 - Wiktor Stribiżew
很棒的解释。我将使用你所有的补充内容。 顺便问一下,我的问题是分隔符。我使用了类似于“ xxx: ”的东西,在我去掉“:”后正常工作了。不确定为什么这样。 在regex.matchs中,“:”效果很好。 - abdo refky
我正在使用类似于该网站上的输入。https://dev59.com/kGIk5IYBdhLWcg3wg-jK. - abdo refky
你的意思是什么?请提供一个输入字符串和期望的结果示例。如何处理每个匹配项(使用或不使用foreach循环)。 - Wiktor Stribiżew
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接