Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于搜索图书名称的Regexp(Delphi 7和DiRegEx 8.8.1)_Regex_Delphi - Fatal编程技术网

用于搜索图书名称的Regexp(Delphi 7和DiRegEx 8.8.1)

用于搜索图书名称的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

我正在使用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?

我的代码是:

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

模式匹配

  • ^
    -字符串的开头
  • (?:
    -启动非捕获组
    • \d+
      -1+位
    • \s+
      -1+空格和
  • )?
    非捕获组结束,出现1或0次(
    使其成为可选)
  • \w+
    -1+字字符
  • (?=\s+\d{1,3}:\d)
    -后跟1+空格、1到3个数字、
    和一个数字


如果只需要匹配字母,
\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)