用于搜索图书名称的Regexp(Delphi 7和DiRegEx 8.8.1)
我正在使用Delphi7,这是我第一次使用库DiRegEx。 我需要做的是收集列表中的书名。清单很长,但要想有一个想法,它看起来是这样的: 2特萨洛尼克下午3:14 2特萨洛尼克下午3:15 2特萨洛尼克下午3:16 2特萨洛尼克下午3:17 2特萨洛尼克下午3:18 蒂莫托维1:1 蒂莫托维1:2 蒂莫托维1:3 提摩托维1:4 所以我想通过RegEx.Match找到的是'2 Tesalonickým'和'1 Timoteovi'字符串。所以我想搜索用于搜索图书名称的Regexp(Delphi 7和DiRegEx 8.8.1),regex,delphi,Regex,Delphi,我正在使用Delphi7,这是我第一次使用库DiRegEx。 我需要做的是收集列表中的书名。清单很长,但要想有一个想法,它看起来是这样的: 2特萨洛尼克下午3:14 2特萨洛尼克下午3:15 2特萨洛尼克下午3:16 2特萨洛尼克下午3:17 2特萨洛尼克下午3:18 蒂莫托维1:1 蒂莫托维1:2 蒂莫托维1:3 提摩托维1:4 所以我想通过RegEx.Match找到的是'2 Tesalonickým'和'1 Timoteovi'字符串。所以我想搜索^一些字符串\d\d?\d?:\d\d?\d
^一些字符串\d\d?\d?:\d\d?\d?
我的代码是:
var
contents : TStringList;
RegEx: TDIRegEx;
WordCount: Integer;
s:string;
begin
Contents := TStringList.Create;
RegEx := TDIPerlRegEx.Create{$IFNDEF DI_No_RegEx_Component}(nil){$ENDIF};
Contents.LoadFromFile('..\reference dlouhé CS.txt');
for i:=0 to Contents.count-1 do
begin
Contents[i];
try
RegEx.SetSubjectStr(Contents[i]);
RegEx.MatchPattern := '\w+';
WordCount := 0;
if RegEx.Match(0) >= 0 then
begin
repeat
Inc(WordCount);
s := RegEx.MatchedStr;
WriteLn(WordCount, ' - ', s);
until RegEx.MatchNext < 0;
end;
finally
RegEx.Free;
end; // end try
end; // end for
end;
var
内容:TStringList;
正则表达式:TDIRegEx;
字数:整数;
s:字符串;
开始
内容:=TStringList.Create;
RegEx:=TDIPerlRegEx.Create{$IFNDEF DI_No_RegEx_Component}(nil){$ENDIF};
Contents.LoadFromFile('..\reference dlouhéCS.txt');
对于i:=0到Contents.count-1 do
开始
内容[i];
尝试
RegEx.SetSubjectStr(目录[i]);
RegEx.MatchPattern:='\w+';
字数:=0;
如果RegEx.Match(0)>=0,则
开始
重复
公司(字数);
s:=RegEx.MatchedStr;
WriteLn(字数,'-',s);
直到RegEx.MatchNext<0;
终止
最后
RegEx.Free;
完结束尝试
完结束
终止
我需要修改正则表达式,以便\d\d?\d?:\d\d?\d?
不会出现在结果中,而是应该是一个“锚”或“针”。如何制作regexp
结果:
这是一份包含66本UTF-8版本圣经的完整清单。由于此dos不包含像Ž或š这样的字符,因此\w模式存在一些问题
起源;离去利未记;数字;氘;乔祖;Soudců;劳特;1萨缪洛娃;2萨缪洛娃;1 Královská;2 Královská;1副脂烯酮;2副脂烯酮;埃兹德拉什;内赫姆亚什;酯;乔布;阿尔米;Příslovií;卡扎特尔;PíseňPísní;伊扎亚什;杰里米·亚什;普拉奇;以西结;丹尼尔;Ozeáš;乔尔;Ámos;阿布迪亚什;乔纳什;米切亚什;那鸿;阿巴库克;索丰亚什;阿吉斯;扎查尔亚什;马拉基亚什;马图什;马雷克;卢卡什;简;Skutky apoštolské;Římanům;1科林茨克ým;2科林茨克ým;加拉茨克姆;埃菲茨克姆;菲利普斯克姆;科洛斯克姆;1特萨洛尼克ým;2特萨洛尼克ým;1蒂莫托维;2蒂莫托维;蒂托维;菲利莫诺维奇;Židům;雅库布诺夫;1彼得罗夫;2彼得罗夫;1 Janův;1月2日;2005年1月3日;朱迪夫;兹杰文尼亚诺沃 您可以使用
(*UCP)^(?:\d+\s+)?\w+(?=\s+\d\d?\d?:\d)
或
在模式开头(PCRE动词)添加(*UCP)
,以使所有速记都能识别Unicode
模式匹配
-字符串的开头^
-启动非捕获组(?:
-1+位\d+
-1+空格和\s+
非捕获组结束,出现1或0次()?
使其成为可选)?
-1+字字符\w+
-后跟1+空格、1到3个数字、(?=\s+\d{1,3}:\d)
和一个数字:
如果只需要匹配字母,
\w
可能需要替换为\p{L}
。谢谢。我将对此进行测试:(*UCP)^\d\w+(?=\s+\d{1,3}:\d)
对于Genesis,开头没有数字。@user1141649然后使用(*UCP)^(?:\d+\s+)\w+(?=\s+\d{1,3}:\d)
当我读取内容[I]:='Genesis 1:2'时,程序在第'RegEx.MatchPattern:='(*UCP)^(?:(?=\d+\s+)\d+\d}\d}\d}行崩溃;{我想问题是我必须在循环中放置TDIPerlRegEx.Create
。所以现在它工作了,但是我需要检查结果。如果你以动态的方式构建这个模式,那么你必须把它放在循环中,尽管它会使性能变差。如果这个集合很长,你需要全文搜索,考虑数据库(例如SQLite)。我认为圣经有大约27本书,所以我应该收集27个结果。现在我想知道为什么:s:=RegEx.MatchedStr代码>如果不是圣经书。查找(s,索引)然后是圣经书。添加(s)代码>添加多个书籍记录。@user1141649圣经中还有更多书籍,请参阅:
(*UCP)^(?:\d+\s+)?\w+(?=\s+\d{1,3}:\d)