正则表达式-重复模式
本文关键字:模式 -重 正则表达式 | 更新日期: 2023-09-27 18:04:48
我就是看不懂....我有一个文本字符串,我需要从中提取一个重复的模式,但我只能得到它的一小部分,或者我得到整个字符串的单个匹配…
字符串是"标记"加"内容"的串联,我需要提取每个标记及其内容。
string s = "T: 2 YE I: 4 YE";
Match m = Regex.Match(s, "(?'marker'(T|I)):(?'content'.+)");
while (m.Success)
{
string Marker = m.Groups["marker"].value; // (T: or I:)
string Content = m.Groups["content"].value; // (2 YE or 4 YE)
m = m.NextMatch();
}
我都试过了。+"answers".+?"的最大/分钟捕获,但我要么得到2个匹配,有标记,但没有内容,或一个匹配与整个输入字符串。
(?'marker'(T|I)):(?'content'.+)
将不起作用,因为.+
将消耗该行的其余部分(它贪婪地匹配,并且没有什么可以阻止它消耗该行的其余部分)。
(?'marker'(T|I)):(?'content'.+?)
.+?
将只消耗一个字符,然后停止,因为它勉强匹配。
你需要能够指定"content"何时结束。我真的不太理解您提供的格式,无法确定我知道正确的方法,但假设任何数量的大写字母后跟冒号(如"T:","ST:"或"ORANGUTANS:")都可以作为标记,这应该可以工作:
([A-Z]+:)(((?![A-Z]+:).)+)
使用负向前看来识别下一个标记开始的位置。第一个和第二个捕获组应该分别捕获标记和内容。
我不太熟悉您用来命名捕获组的语法,但我相信这应该可以工作:
(?'marker'[A-Z]+:)(?'content'((?![A-Z]+:).)+)
试试这个:
Regex("(T:|I:)").Split(s);