【问题标题】:Yunqa DiRegExpr - Case insensitive match for Cyrillic textYunqa DiRegExpr - Cyrillic 文本不区分大小写匹配
【发布时间】:2016-08-21 12:59:36
【问题描述】:

Yunqa DiRegExpr 中的 (?i) 标记用于使匹配不区分大小写,但在使用西里尔文文本时似乎不起作用。例如:

\P{Cyrillic}(?i)ново 

应该匹配大写的Ново,但它不匹配。有没有办法让这个工作?

使用我们看到的 DiRegEx Workbench 应用程序:

我的代码使用:

 if ContainsText(MatchPattern, '(?i)') or 
    ContainsText(MatchPattern, '(?is)') or 
    ContainsText(MatchPattern, '(?si)') then 
      rexp.CompileOptions := [coCaseLess];

【问题讨论】:

  • 这是英语 StackOverflow -> 请参阅:ru.stackoverflow.com
  • 了解您使用的是哪个版本的 delphi 以及哪个版本的 DiRegExpr 很重要。显示演示问题的完整代码也很重要。这很可能是 Ansi 和 Unicode 编码字符串之间的混淆。但是,如果没有看到您正在使用的代码,就很难提供帮助。请参阅:minimal reproducible example(或:на русском
  • @J...:他或她确实是用英语写的,对吧?
  • @RudyVelthuis 我的编辑。
  • 不,请编辑问题。您应该花一些时间在help center 上,以便了解该网站的运作方式。

标签: delphi


【解决方案1】:

如果您使用 UTF8 编码的 Unicode 字符串,则必须使用 [coUtf8] (PCRE_UTF8) 编译选项。使用此设置匹配成功。

即:

 rexp.CompileOptions := rexp.CompileOptions + [coUtf8];

要查看结果,您需要在控制台中安装 unicode 字体,但这里有一个示例程序来演示这一点。

program Project1;
{$APPTYPE CONSOLE}
uses
  Windows, DISystemCompat, DIUtils, DIRegEx;
var
  RegEx: TDIRegEx16;
  matched : string;
begin
  SetConsoleOutputCP(CP_UTF8);
  RegEx := TDIPerlRegEx16.Create(nil);
  try
    { comment out line below to replicate problem }
    RegEx.CompileOptions := [coUtf8];
    RegEx.SetSubjectStr('Ново');
    RegEx.CompileMatchPatternStr('(?i)ново');
    if RegEx.Match(0) > 0 then
      repeat
        matched := RegEx.MatchedStr;
        WriteLn('Matched: ', UTF8Encode(matched));
      until RegEx.MatchNext < 0
    else
      WriteLn('No match.');
  finally
    RegEx.Free;
  end;
  ReadLn;
end.

您会注意到,通过在模式中包含 (?i),您不需要在编译选项中包含 [coCaseLess](因为您也在匹配中明确指定了它)。

如果您确实想使用 compile 选项,您可以从模式中省略 (?i) 并直接执行此操作,这也可以:

 RegEx.CompileOptions := [coCaseLess, coUtf8];
 RegEx.SetSubjectStr('Ново');
 RegEx.CompileMatchPatternStr('ново');

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 2017-11-14
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2012-12-03
    相关资源
    最近更新 更多