先日の「真」の文字が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;
回答がつかないようなので…
真という字はShift_JISで0x905Eですが、0x5E="^"は正規表現で意味を持つ特殊文字なので、
正規表現ライブラリがShift_JISに対応していないとうまくマッチしない気がします。
外していたらすいません。
# PerlRegEx1.RegEx := #$90 + '\' + #$5E; とかでマッチしませんか?
> # 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;
HFUKUSHIさん、まさにそれでした、
#$90 + '\' + #$5E; でマッチしますが実際には真冬とか真夏とかの検索ワードで
利用しようと思っていたので、大進展です。
Mr.XRAYさん。ありがとうございます。
原因がわかっても対応のしようを思いつかなかったので助かりました。
連文だとだめかなと思ったのですがtregexprでもtperlexでも、作っていただいた関数を利用すると無事認識されました。
Mr.XRAYさんのHPもよく拝見させていただいています。
お二人とも、どうもありがとうございました。
とてもたすかりました。またお世話になると思いますが、今後ともよろしくお願いします(>_<)
ツイート | ![]() |