regex 如何从模式X正则表达式到下一个出现的X,递归地,获得之间的内容作为匹配

l7wslrjt  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(67)

使用regex,通过对以下字符串执行(?s)X(.*?)Y

X
aaa
Y
X
bbb
Y
X
ccc
Y

我得到:

Match1.Group1: "aaa"  
Match2.Group1: "bbb"  
Match3.Group1: "ccc"

我想得到相同的结果(比赛和小组)与以下:

X
aaaa
X
bbbb
X
cccc

但我无法理解该怎么做。感谢您花时间阅读和回复。
我能想到的办法都试过了。我使用C#语言和https://regex101.com/来测试regex语句。

qco9c6ql

qco9c6ql1#

看看这个

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string input = "X\naaaa\nX\nbbbb\nX\ncccc";

        //modify the regex pattern to exclude "X"
        string pattern = @"(?s)X((?:(?!X).)*)";

        //matching the pattern in the input string
        MatchCollection matches = Regex.Matches(input, pattern);

        for (int i = 0; i < matches.Count; i++)
        {
            Console.WriteLine($"Match{i + 1}.Group1: \"{matches[i].Groups[1].Value}\"");
        }
    }
}

输出量:

Match1.Group1: "aaaa"
Match2.Group1: "bbbb"
Match3.Group1: "cccc"
inkz8wg9

inkz8wg92#

没有Regex:

string txt = "X\naaaa\nX\nbbbb\nX\ncccc";
string[] matches = txt.Replace("\n",null).Split(new string[] {"X"}, StringSplitOptions.RemoveEmptyEntries);
foreach (string match in matches) {
    Console.WriteLine(match);
}
js81xvg6

js81xvg63#

您使用的模式.*?也可以匹配X字符,因此必须防止匹配X字符,直到第一次出现Y字符。
由于您已经在使用捕获组,因此可以使用取反字符类[^捕获值,而无需使用(?s)
如果你不想修剪值,并且中间至少应该有一个非空格字符,而不是X

X\s*([^\sX](?:[^X]*[^\sX])?)

Regex demo| C# demo

string pattern = @"X\s*([^\sX](?:[^X]*[^\sX])?)";
string input = @"X
aaaa
X
bbbb
X
cccc
XX";

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Groups[1].Value);
}

输出

aaaa
bbbb
cccc

仅匹配版本,而不是具有正向后看的捕获组:

(?<=X\s*)[^\sX](?:[^X]*[^\sX])?

Regex demo
或者更简单的模式,捕捉任何字符:

X([^X]+)

Regex demo| C# Demo

相关问题