C# Regex - 从可重复组中获取值
C# Regex - get values from repeatable groups
我有这个正则表达式模式,我试图找出一个句子(字符串)是否匹配它。
我的图案:
@"^A\s(?<TERM1>[A-Z][a-z]{1,})\sconsists\sof\s((?<MINIMUM1>(\d+))\sto\s(?<MAXIMUM1>(\d+|many){1})|(?<MINMAX1>(\d+|many{1}){1}){1})\s(?<TERM2>[A-Z][a-z]{1,})(\sand\s((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$"
如何阅读我的模式:
A (TERM1) consists of (MINIMUM1 to (MAXIMUM1|many)|(MINMAX1|many)) (TERM2) ((?#********RepeatablePart********)and (MINIMUM2 to (MAXIMUM2|many)|(MINMAX|many)) (TERM3))+.
MINMAX1/MINMAX2 可以是数字或只是单词 'many',MINIMUM1/MINIMUM2 是数字,MAXIMUM1/MAXIMUM2 可以是数字或单词 'many'.
例句:
- 一辆汽车由 2 到 5 个座位和 1 个刹车踏板和 1 个油门踏板以及 4 到 6 个 Windows.
- 一棵树由许多苹果和 2 到许多颜色以及 0 到 1 只松鼠和许多树叶组成。
一本书由 1 到多个作者和 1 个标题和 3 个书签组成。
- 将包含:TERM1 = 汽车,MINIMUM1 = 2,MAXIMUM1 = 5,MINMAX1 = null,TERM2 = 座位,MINIMUM2 = null,MAXIMUM2 = null,MINMAX2 = 1,TERM3 = Breakpedal,MINIMUM2 = null,MAXIMUM2 =空,MINMAX2=1,TERM3= 油门踏板,MINIMUM2 = 4,MAXIMUM2 = 6,MINMAX2= 空,TERM3= Windows
- 将包含:TERM1 = 树,MINIMUM1 = null,MAXIMUM1 = null,MINMAX1 = 许多,TERM2 = 苹果,MINIMUM2 = 2,MAXIMUM2 = 许多,MINMAX2 = null,TERM3 = 颜色,MINIMUM2 = 0,MAXIMUM2 = 1, MINMAX2 = null, TERM3=Squirrel, MINIMUM2 = null, MAXIMUM2 = null, MINMAX2 = many, TERM3=Leaves
- 将包含:TERM1 = 图书,MINIMUM1 = 1,MAXIMUM1 = 许多,MINMAX1 = null,TERM2 = 作者,MINIMUM2 = null,MAXIMUM2 = null,MINMAX2 = 1,TERM3 = 标题,MINIMUM2 = null,MAXIMUM2 =空,MINMAX2 = 3,TERM3=书签
我创建了一个 class,我想用我的字符串中可重复部分的值填充它(谈到 MINIMUM2、MAXIMUM2、MINMAX 和 TERM3):
//MyObject contains the values of one expression from the repateatable part.
public class MyObject
{
public string term { get; set; }
public string min { get; set; }
public string max { get; set; }
public string minmax { get; set; }
}
因为我的模式有一个可重复的部分 (+) 我想创建一个列表,我在其中添加一个新的 object (MyObject) 我想填写的值可修复组。
我的问题是我不确定如何用我的可重复部分的值填充我的 object。我尝试编码的方式是错误的,因为我的列表没有相同数量的值,因为
句子(例如 'A Book consists of 1 to many Authors and 1 Title and 3 Bookmarks.'.)在每个可重复部分中永远不会有一个 MINIMUM2、一个 MAXIMUM2 和一个 MINMAX2。
是否有更简单的方法来填充我的 Object 或者我如何从量词部分获取值?
我的代码(在 c# 中):
var match = Regex.Match(exampleText, pattern);
if (match.Success)
{
string term1 = match.Groups["TERM1"].Value;
string minimum1 = match.Groups["MINIMUM1"].Value;
string maximum1 = match.Groups["MAXIMUM1"].Value;
string minmax1 = match.Groups["MINMAX1"].Value;
string term2 = match.Groups["TERM2"].Value;
//--> Groups[].Captures..ToList() might be wrong. Maybe there is a better way to get the values of the reapeatable Part
List<string> minimums2 = match.Groups["MINIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> maximums2 = match.Groups["MAXIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> minmaxs2 = match.Groups["MINMAX2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> terms3 = match.Groups["TERM3"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<MyObject> myList = new List<MyObject>();
for (int i = 0; i<terms3.Count; i++)
{
myList.Add(new MyObject()
{
term = terms3[i],
min = minimums2[i] //-->ERROR MIGHT HAPPEN when List<string>minimums2 doesn't have the same amount of values like List<string> terms3
max = maximums2[i] //-->ERROR..
minmax = minmaxs2[i] //-->ERROR...
});
}
}
我可以通过在单词 'and' 之后拆分我的 exampleText 自己解决我的问题,所以我有一个字符串 'splittedText',其中包含我的模式的可重复部分的每个短语。
string[] splittedText = Regex.Split(exampleText, @"\sand\s");
拆分 exampleText 后,我在 for 循环中将每个短语的值插入到 myObject 中,我在其中执行另一个 regex.match 以从每个短语中获取我需要的值。
string pattern2 =(((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$
List<MyObject> myList = new List<MyObject>();
//i = 1 -> since splittedText[0] contains the beginning of the sentence (e.g. 'A Car consists of 2 to 5 Seats')
for (int i = 1; i<splittedText.Count(); i++)
{
var match2 = Regex.Match(splittedText[i], pattern2);
if (match2.Success)
{
myList.Add(new MyObject()
{
term = match2.Groups["TERM3"].Value,
min = match2.Groups["MININUM2"].Value,
max = match2.Groups["MAXIMUM2"].Value,
minmax = match2.Groups["MINMAX2"].Value
});
}
}
我有这个正则表达式模式,我试图找出一个句子(字符串)是否匹配它。
我的图案:
@"^A\s(?<TERM1>[A-Z][a-z]{1,})\sconsists\sof\s((?<MINIMUM1>(\d+))\sto\s(?<MAXIMUM1>(\d+|many){1})|(?<MINMAX1>(\d+|many{1}){1}){1})\s(?<TERM2>[A-Z][a-z]{1,})(\sand\s((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$"
如何阅读我的模式:
A (TERM1) consists of (MINIMUM1 to (MAXIMUM1|many)|(MINMAX1|many)) (TERM2) ((?#********RepeatablePart********)and (MINIMUM2 to (MAXIMUM2|many)|(MINMAX|many)) (TERM3))+.
MINMAX1/MINMAX2 可以是数字或只是单词 'many',MINIMUM1/MINIMUM2 是数字,MAXIMUM1/MAXIMUM2 可以是数字或单词 'many'.
例句:
- 一辆汽车由 2 到 5 个座位和 1 个刹车踏板和 1 个油门踏板以及 4 到 6 个 Windows.
- 一棵树由许多苹果和 2 到许多颜色以及 0 到 1 只松鼠和许多树叶组成。
一本书由 1 到多个作者和 1 个标题和 3 个书签组成。
- 将包含:TERM1 = 汽车,MINIMUM1 = 2,MAXIMUM1 = 5,MINMAX1 = null,TERM2 = 座位,MINIMUM2 = null,MAXIMUM2 = null,MINMAX2 = 1,TERM3 = Breakpedal,MINIMUM2 = null,MAXIMUM2 =空,MINMAX2=1,TERM3= 油门踏板,MINIMUM2 = 4,MAXIMUM2 = 6,MINMAX2= 空,TERM3= Windows
- 将包含:TERM1 = 树,MINIMUM1 = null,MAXIMUM1 = null,MINMAX1 = 许多,TERM2 = 苹果,MINIMUM2 = 2,MAXIMUM2 = 许多,MINMAX2 = null,TERM3 = 颜色,MINIMUM2 = 0,MAXIMUM2 = 1, MINMAX2 = null, TERM3=Squirrel, MINIMUM2 = null, MAXIMUM2 = null, MINMAX2 = many, TERM3=Leaves
- 将包含:TERM1 = 图书,MINIMUM1 = 1,MAXIMUM1 = 许多,MINMAX1 = null,TERM2 = 作者,MINIMUM2 = null,MAXIMUM2 = null,MINMAX2 = 1,TERM3 = 标题,MINIMUM2 = null,MAXIMUM2 =空,MINMAX2 = 3,TERM3=书签
我创建了一个 class,我想用我的字符串中可重复部分的值填充它(谈到 MINIMUM2、MAXIMUM2、MINMAX 和 TERM3):
//MyObject contains the values of one expression from the repateatable part.
public class MyObject
{
public string term { get; set; }
public string min { get; set; }
public string max { get; set; }
public string minmax { get; set; }
}
因为我的模式有一个可重复的部分 (+) 我想创建一个列表,我在其中添加一个新的 object (MyObject) 我想填写的值可修复组。
我的问题是我不确定如何用我的可重复部分的值填充我的 object。我尝试编码的方式是错误的,因为我的列表没有相同数量的值,因为 句子(例如 'A Book consists of 1 to many Authors and 1 Title and 3 Bookmarks.'.)在每个可重复部分中永远不会有一个 MINIMUM2、一个 MAXIMUM2 和一个 MINMAX2。
是否有更简单的方法来填充我的 Object 或者我如何从量词部分获取值?
我的代码(在 c# 中):
var match = Regex.Match(exampleText, pattern);
if (match.Success)
{
string term1 = match.Groups["TERM1"].Value;
string minimum1 = match.Groups["MINIMUM1"].Value;
string maximum1 = match.Groups["MAXIMUM1"].Value;
string minmax1 = match.Groups["MINMAX1"].Value;
string term2 = match.Groups["TERM2"].Value;
//--> Groups[].Captures..ToList() might be wrong. Maybe there is a better way to get the values of the reapeatable Part
List<string> minimums2 = match.Groups["MINIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> maximums2 = match.Groups["MAXIMUM2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> minmaxs2 = match.Groups["MINMAX2"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<string> terms3 = match.Groups["TERM3"].Captures.Cast<Capture>().Select(x => x.Value).ToList<string>();
List<MyObject> myList = new List<MyObject>();
for (int i = 0; i<terms3.Count; i++)
{
myList.Add(new MyObject()
{
term = terms3[i],
min = minimums2[i] //-->ERROR MIGHT HAPPEN when List<string>minimums2 doesn't have the same amount of values like List<string> terms3
max = maximums2[i] //-->ERROR..
minmax = minmaxs2[i] //-->ERROR...
});
}
}
我可以通过在单词 'and' 之后拆分我的 exampleText 自己解决我的问题,所以我有一个字符串 'splittedText',其中包含我的模式的可重复部分的每个短语。
string[] splittedText = Regex.Split(exampleText, @"\sand\s");
拆分 exampleText 后,我在 for 循环中将每个短语的值插入到 myObject 中,我在其中执行另一个 regex.match 以从每个短语中获取我需要的值。
string pattern2 =(((?#********RepeatablePart********)(?<MININUM2>(\d+))\sto\s(?<MAXIMUM2>(\d+|many){1})|(?<MINMAX2>(\d+|many{1}){1}){1})\s(?<TERM3>([A-Z][a-z]{1,})))+\.$
List<MyObject> myList = new List<MyObject>();
//i = 1 -> since splittedText[0] contains the beginning of the sentence (e.g. 'A Car consists of 2 to 5 Seats')
for (int i = 1; i<splittedText.Count(); i++)
{
var match2 = Regex.Match(splittedText[i], pattern2);
if (match2.Success)
{
myList.Add(new MyObject()
{
term = match2.Groups["TERM3"].Value,
min = match2.Groups["MININUM2"].Value,
max = match2.Groups["MAXIMUM2"].Value,
minmax = match2.Groups["MINMAX2"].Value
});
}
}