- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个正则表达式,其作用是将所有匹配项返回到其三个备用捕获组。我的目标是了解每场比赛是哪个捕获组产生的。 PCRE 似乎能够产生该信息。但我还无法强制 Delphi XE8 中的 TRegEx
类来生成有意义的匹配捕获组信息。我不能声称自己是正则表达式类的负责人,而且 TRegEx
对我来说是新的,所以谁知道我犯了什么错误。
正则表达式 ( regex101.com workpad ) 是:
(?'word'\b[a-zA-Z]{3,}\b)|(?'id'\b\d{1,3}\b)|(?'course'\b[BL]\d{3}\b)
此测试文本:
externship L763 clinic 207 B706 b512
在测试环境中给出了五场比赛。但是,一个简单的测试程序遍历 TMatchCollection
中每个 TMatch
的 TGroupCollection
显示了有关组的奇怪结果:所有匹配项都有多个组( 2、3 或 4),每个组的 Success
为 true,并且匹配的文本通常在多个组中重复或为空。所以这个数据结构(如下)不是我所期望的:
Using TRegEx
Regex: (?'word'\b[a-zA-Z]{3,}\b)|(?'id'\b\d{1,3}\b)|(?'course'\b[BL]\d{3}\b)
Text: externship L763 clinic 207 B706 b512
5 matches
'externship' with 2 groups:
length 10 at 1 value 'externship' (Sucess? True)
length 10 at 1 value 'externship' (Sucess? True)
'L763' with 4 groups:
length 4 at 12 value 'L763' (Sucess? True)
length 0 at 1 value '' (Sucess? True)
length 0 at 1 value '' (Sucess? True)
length 4 at 12 value 'L763' (Sucess? True)
'clinic' with 2 groups:
length 6 at 17 value 'clinic' (Sucess? True)
length 6 at 17 value 'clinic' (Sucess? True)
'207' with 3 groups:
length 3 at 24 value '207' (Sucess? True)
length 0 at 1 value '' (Sucess? True)
length 3 at 24 value '207' (Sucess? True)
'B706' with 4 groups:
length 4 at 28 value 'B706' (Sucess? True)
length 0 at 1 value '' (Sucess? True)
length 0 at 1 value '' (Sucess? True)
length 4 at 28 value 'B706' (Sucess? True)
我的简单测试运行程序是这样的:
program regex_tester;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.RegularExpressions,
System.RegularExpressionsCore;
var
Matched : Boolean;
J : integer;
Group : TGroup;
Match : TMatch;
Matches : TMatchCollection;
RegexText,
TestText : String;
RX : TRegEx;
RXPerl : TPerlRegEx;
begin
try
RegexText:='(?''word''\b[a-zA-Z]{3,}\b)|(?''id''\b\d{1,3}\b)|(?''course''\b[BL]\d{3}\b)';
TestText:='externship L763 clinic 207 B706 b512';
RX:=TRegex.Create(RegexText);
Matches:=RX.Matches(TestText);
Writeln(Format(#10#13#10#13'Using TRegEx'#10#13'Regex: %s'#10#13'Text: %s'#10#13,[RegexText, TestText]));
Writeln(Format('%d matches', [Matches.Count]));
for Match in Matches do
begin
Writeln(Format(' ''%s'' with %d groups:', [Match.Value,Match.Groups.Count]));
for Group in Match.Groups do
Writeln(Format(#9'length %d at %d value ''%s'' (Sucess? %s)', [Group.Length,Group.Index,Group.Value,BoolToStr(Group.Success, True)]));
end;
RXPerl:=TPerlRegEx.Create;
RXPerl.Subject:=TestText;
RXPerl.RegEx:=RegexText;
Writeln(Format(#10#13#10#13'Using TPerlRegEx'#10#13'Regex: %s'#10#13'Text: %s'#10#13,[RXPerl.Regex, RXPerl.Subject]));
Matched:=RXPerl.Match;
if Matched then
repeat
begin
Writeln(Format(' ''%s'' with %d groups:', [RXPerl.MatchedText,RXPerl.GroupCount]));
for J:=1 to RXPerl.GroupCount do
Writeln(Format(#9'length %d at %d, value ''%s''',[RXPerl.GroupLengths[J],RXPerl.GroupOffsets[J],RXPerl.Groups[J]]));
Matched:=RXPerl.MatchAgain;
end;
until Matched=false;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
我当然希望能在正确的方向上有所插入。如果 TRegEx
被破坏,我当然可以使用替代方案 - 或者我可以放弃解决方案的优雅性,而是使用三个更简单的测试来查找我需要的信息。
正如 @andrei-galatyn 所说,TRegEx
使用 TPerlRegEx
进行工作。因此,我在测试程序中添加了一个部分(输出如下),我也在其中进行了实验。它使用起来不如 TRegEx
方便,但它的结果是它应该的样子,并且没有 TRegEx 损坏的 TGroup
数据结构的问题。无论我使用哪个类,最后一个组的索引(TRegEx 小于 1)就是我想要的捕获组。
一路上我被提醒,Pascal 数组通常基于 1 而不是 0。
Using TPerlRegEx
Regex: (?'word'\b[a-zA-Z]{3,}\b)|(?'id'\b\d{1,3}\b)|(?'course'\b[BL]\d{3}\b)
Text: externship L763 clinic 207 B706 b512
'externship' with 1 groups:
length 10 at 1, value 'externship'
'L763' with 3 groups:
length 0 at 1, value ''
length 0 at 1, value ''
length 4 at 12, value 'L763'
'clinic' with 1 groups:
length 6 at 17, value 'clinic'
'207' with 2 groups:
length 0 at 1, value ''
length 3 at 24, value '207'
'B706' with 3 groups:
length 0 at 1, value ''
length 0 at 1, value ''
length 4 at 28, value 'B706'
最佳答案
Delphi 内部使用 TPerlRegEx 类,它对 GroupCount 属性有这样的描述:
存储在组数组中的匹配组数。该数字是正则表达式中实际参与上一次匹配的编号最大的捕获组的编号。它可能小于正则表达式中捕获组的数量。
例如当正则表达式“(a)|(b)”匹配“a”时,GroupCount将为1。当相同的正则表达式匹配“b”时,GroupCount将为2。
TRegEx 类总是添加一组(我猜是为了整个表达式)。在你的情况下,检查每一个匹配应该就足够了:
case Match.Groups.Count-1 of
1: ; // "word" found
2: ; // "id" found
3: ; // "course" found
end;
它没有回答为什么群组中充满了奇怪的数据,实际上它似乎足以回答你的问题。 :)
关于regex - 使用 Delphi 的 TRegex 获取与结果匹配的捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30804569/
我见过几个 TRegEx 使用的 Delphi 示例,例如 Delphi 10.1.2 中的以下示例: try RegexObj := TRegEx.Create(REGEX_EXTRACTEMA
我正在处理 TStringList 中的多个字符串,并且想要跳过一些与特定正则表达式模式不匹配的行。因此我创建了一个 ^(?!\t\w+\t\w+) 的模式并尝试过 program P; uses
如果它们与模式匹配,我想将大字符串中的所有字符@替换为#13#10。 但是如何获取我的“[0-9][0-9][0-9][0-9][0-9][0-9][0-9]”的值要放入我的替换字段的模式? patt
我在使用 TRegEx.replace 时遇到问题: var Value, Pattern, Replace: string; begin Value := 'my_replace_str
我创建了一个使用 Tregex 提取子树的类。我使用了“TregexPattern.java”中的一些代码片段,因为我不想让程序使用控制台命令。 一般来说,有一个句子的树,我想提取某些子树(没有用户交
我有一个小函数,用于在用户取消编辑后验证 StringGrid 中的列。 void validateColumn(int column, const UnicodeString regexp, TSt
背景:我遇到的一个应用程序使用 TRegEx来自多个线程的单例。单例初始化为 TRegEx.Create(Pattern, [roCompiled])在类构造函数中,线程使用它以 RegEx.Matc
我试图弄清楚是否可以使用多个单词的条件有效地提取 NP。这是我当前的代码: public static List getNounPhrasesWithMultipleKeywords(Annotati
我希望在 Delphi XE 中创建一个正则表达式,它将匹配一个数字,后跟一个小数点,后跟(本质上)无限数量的数字。 有效示例: 2.334 150.2 0.23 3 无效示例: 3..42 4-2.
我编写了一个正则表达式,其作用是将所有匹配项返回到其三个备用捕获组。我的目标是了解每场比赛是哪个捕获组产生的。 PCRE 似乎能够产生该信息。但我还无法强制 Delphi XE8 中的 TRegEx
我想根据连词和逗号分割树。例如,当我有 VP 和 VP 或 NP 和 NP 或 VP, VP 或 NP,NP 时,我想分别提取每个 VP 或 NP。我有以下代码: List subtrees = c
我是 NLP 和 Python 的新手。我正在尝试使用 Tregex 工具和 Python 子进程库从 StanfordCoreNLP 的解析树中提取名词短语的子集。特别是,我正在尝试查找并提取与以下
我是一名优秀的程序员,十分优秀!