delphi7の正規表現で環境を変えても「真」がマッチしない件について

解決


 2021-09-22 10:27:51  No: 149848  IP: [192.*.*.*]

先日の「真」の文字がtregexprでマッチングしない件について
あの後、TPERLEXと言う他の正規表現コンポでも試してみましたが
同じようにマッチしませんでした。

下記の2つともマッチしないのですが、これは何に問題があるのでしょうか?

procedure TForm1.Button2Click(Sender: TObject);
begin
PerlRegEx1.Subject := '真';
PerlRegEx1.RegEx   := '真';

if PerlRegEx1.Match then
begin
ShowMessage('ある');
end
else
begin
ShowMessage('ない');
end;
end;
//-----------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
var
s,rex:string;
b:boolean;
begin
s:='真';
rex := '真';
b:=ExecRegExpr(rex,s);

if b=true then
ShowMessage('OK')
else
ShowMessage('No');
end;

編集 削除
HFUKUSHI  2021-09-23 05:13:37  No: 149849  IP: [192.*.*.*]

回答がつかないようなので…
真という字はShift_JISで0x905Eですが、0x5E="^"は正規表現で意味を持つ特殊文字なので、
正規表現ライブラリがShift_JISに対応していないとうまくマッチしない気がします。
外していたらすいません。
# PerlRegEx1.RegEx   := #$90 + '\' + #$5E; とかでマッチしませんか?

編集 削除
Mr.XRAY  2021-09-24 08:15:44  No: 149850  IP: [192.*.*.*]

> # PerlRegEx1.RegEx   := #$90 + '\' + #$5E; とかでマッチしませんか?

なるほど.でしたらこんな感じでいけるかも 😊
Dephi 6 / 7 あたりだったら VBScript という手もあるかも知れませんか・・・
ダウンロード元は質問者のコードから推測しました.

[参考]
[ 正規表現の活用 (主に Delphi 2009 以降) ]
https://ht-deko.com/tech064.html

//-----------------------------------------------------------------------------
//  マルチバイトに対応していない Ansi 正規表現ライブラリ用の関数
//  漢字を含む文字列を使用可能にするための処理
//  例 : 真
//-----------------------------------------------------------------------------
function ConvCode(AStr: AnsiString): String;
var
  LStr  : String;
  LPStr : PChar;
begin
  Result := '';
  LStr  := AStr + #0;
  LPStr := PChar(LStr);

  while Byte(LPStr^) <> 0 do begin
    Result := Result + Char(LPStr^);
    if (Char(LPStr^) in LeadBytes) then begin
      Inc(LPStr);
      Result := Result + '\' + Char(LPStr^);
    end;
    Inc(LPStr);
  end;
end;

//=============================================================================
//  上の関数のテスト
//  (1) 以下の URL から older component... の TPerlRegEx2009.zip をダウンロード
//      https://www.regular-expressions.info/delphi.html
//  (2) 解凍して以下をプロジェクトのフォルダ内に配置
//     [pcre] フォルダ
//     pcre.pas
//     PerlRegEx.pas
//     pcrelib.dll
//  (3) uses に PerlRegEx を追加
//
//  動作確認環境
//  Windows [Version 10.0.19042] + Delphi 6(UP2) Pro 
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LPerlReg : TPerlRegEx;
begin
  LPerlReg := TPerlRegEx.Create(Self);
  try
    LPerlReg.Subject := '日本語 真ABC';
    LPerlReg.RegEx   := ConvCode('真');

    if LPerlReg.Match then begin
      ShowMessage('True');
    end;
  finally
    FreeAndNil(LPerlReg);
  end;
end;

編集 削除
 2021-09-26 05:58:55  No: 149851  IP: [192.*.*.*]

HFUKUSHIさん、まさにそれでした、

#$90 + '\' + #$5E; でマッチしますが実際には真冬とか真夏とかの検索ワードで
利用しようと思っていたので、大進展です。

Mr.XRAYさん。ありがとうございます。
原因がわかっても対応のしようを思いつかなかったので助かりました。
連文だとだめかなと思ったのですがtregexprでもtperlexでも、作っていただいた関数を利用すると無事認識されました。
Mr.XRAYさんのHPもよく拝見させていただいています。

お二人とも、どうもありがとうございました。
とてもたすかりました。またお世話になると思いますが、今後ともよろしくお願いします(>_<) 

編集 削除