TA的每日心情 | 擦汗 2020-7-3 13:51 |
---|
签到天数: 19 天 [LV.4]偶尔看看III
状元
- 积分
- 10032
|
“组数不定又想直接引用,本身就矛盾” —— 的确,如果仅仅在notepad++, EmEditor等这些编辑器里进行的简单的正则替换操做,似乎没有什么好方法来表示这些数量都不确定的组。但是一到程序设计,就不一样了!
显然,高级语言的正则库在匹配成功之后每一个分组都已经确定得到了,既然得到了就有办法让它全部保存起来用于今后的引用。
这里以C#为例(C#的正则库功能天下第一,论支持完整度超过Python, JavaScript, Perl, Java等所有其他高级语言中的正则库!而且没有哪个语言(包括Python)在Windows上开发图形界面软件有C#方便!希望更多的C#程序员来这个论坛!)。
见以下简短的程序:
C#语言中某单个匹配的所有分组用一个GroupCollection对象groups表示,该对象中的每一个成员是一个Group对象,groups[0]表示0号分组,在现有的库下,如果硬要引用带量词(如 + * ? {m,n})的组,那么根据我的实验 MessageBox.Show(groups[0].Value); 这条语句会打印出来所有匹配上的子分组(目前它们都属于\0这同一个“母”分组)的最后一个子分组的值,其他子分组的值无法被引用。
但是假如我现在拓展C#正则库,在某一个带量词的分组上再设计出一个Subgroups属性来表示所有(而不仅是最后那一个)子分组,我就可以在一个foreach结构里用subgroups来方便地遍历引用所有这些子分组的值。因为我知道所有子分组个数不超过subgroups.Count,我不会发生越界引用的错误。这里只是用MessageBox.Show在屏幕上显示一下子分组的内容而已,但实际编程时可以对已经得到的子分组根据业务需求做各种复杂的处理。
Match match = Regex.Match(input, pattern); //match表示一个匹配
if (match.Success) // 至少有一个匹配成功
{
GroupCollection groups = match.Groups; // 获得一个匹配中所有的分组(可以理解为它象是一个数组,每个分量代表一个正则表达式中小括号表示的分组)
MessageBox.Show(groups[0].Value); // 显示0号分组的值,因为0号“母”分组带量词(如 + * ? {m,n}),实际对应很多子分组,现行API或者说正则语法无法表示引用每个子分组,结果通过做实验可知这里实际显示的是最后一个子分组的值
SubgroupCollection subgroups = groups[0].Subgroups; // 获得带量词重复多次的0号"母"分组实际匹配上的所有子分组,可以把它想象成一个数组,每个分量就是一个0号"母"分组的子分组—— 这条语句是我发明的,实际不存在是编译不过去的,
for (int i = 0; i < subgroups.Count; i++) // subgroups.Count是0号分组所有子分组的数目 —— 这条语句是我发明的,实际不存在是编译不过去的,
{
MessageBox.Show(subgroups); // 显示每个子分组的值 —— 这条语句我发明的,实际不存在是编译不过去的。注意: 因为未知原因,本语句中subgroups后 有一个引用下标死活不在本站网页显示,这里贴一个图片在最后纠正:
}
}
有可能,我的这个要求C#已经实现了只是我不知道,或者其他高级语言正则库里有实现的,知道的朋友请告知,多谢!
|
|