喫茶XRAYトップページ


[10006] 正規表現で\nを検索返信 削除
2016/5/29 (日) 17:31:36 Mr.XRAY
[TRegExprでの置換処理時、「\n」を改行文字として置換させるには]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201605/16050007.txt

を読んで思い出したので.
正規表現で \n という文字列を検索する際,\n と指定しても無効です.
正規表現では \ は特別な意味を持つ文字で,メタ文字と呼ばれていいます.
メタ文字を検索の対象にするには,メタ文字の前に \ を付けます.

次のコードは,\n を検索して,改行文字である sLineBreak に置き換えます.
(\n は改行の意味なので...)

# 某掲示板の質問の文章は,私の能力では理解できません.

implementation

uses
  SkRegExpW;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := 'テスト用\n\nのテキ\nスト';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LRegExp     : TSkRegExp;
  LDestText   : string;
  LReplaceStr : string;
begin
  LRegExp := TSkRegExp.Create;
  try
    LRegExp.Expression := '\\n';
    LRegExp.IgnoreCase := True;

    LReplaceStr := sLineBreak;

    LDestText := LRegExp.Replace(Memo1.Lines.Text, LReplaceStr);
    Memo1.Lines.Text := LDestText;
  finally
    LRegExp.Free;
  end;
end;



[10009] Re:正規表現で\nを検索返信 削除
2016/5/29 (日) 19:14:06 Mr.XRAY
> 次のコードは,\n を検索して,改行文字である sLineBreak に置き換えます.

このコードは小宮さんの SkRegExp を使用した例です.
動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

http://skregexp.komish.com/


[10010] Re2:正規表現で\nを検索返信 削除
2016/5/29 (日) 19:33:31 Mr.XRAY
> このコードは小宮さんの SkRegExp を使用した例です.
> 動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.


某掲示板にリンクのある以下をダウンロードしてテストしてみました.

[TRegExpr library] for Delphi 2-7
http://regexpstudio.com/TRegExpr/TRegExpr.html

動作確認は Windows 7 U64(SP1) + Delphi 6(UP2) Pro です.


implementation

uses
  RegExpr;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := 'テスト用\n\nのテキ\nスト';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LRegExp     : TRegExpr;
  LDestText   : string;
  LReplaceStr : string;
begin
  LRegExp := TRegExpr.Create;
  try
    LRegExp.Expression := '\\n';

    LReplaceStr := sLineBreak;

    LDestText := LRegExp.Replace(Memo1.Lines.Text, LReplaceStr);
    Memo1.Lines.Text := LDestText;
  finally
    LRegExp.Free;
  end;
end;


[10017] Re:正規表現で\nを検索返信 削除
2016/5/30 (月) 09:59:25 Mr.XRAY
> 正規表現で \n という文字列を検索する際,\n と指定しても無効です.

単に \n という文字列を置換するだけであれば,StringReplace 関数で
いいんですけどね.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := 'テスト用\n\nのテキ\nスト';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LDestText   : string;
  LReplaceStr : string;
begin
  LReplaceStr := sLineBreak;
  LDestText := StringReplace(Memo1.Lines.Text, '\n', LReplaceStr, [rfReplaceAll]);
  Memo1.Lines.Text := LDestText;
end;


[10018] Re:正規表現で\nを検索返信 削除
2016/5/30 (月) 11:42:50 Mr.XRAY
># 某掲示板の質問の文章は,私の能力では理解できません.

Substitute というメソッドを使っているようなんですが,
これは,文章全体を置き換えるのではないかと思うのですが...
どういう場面で使うのかは分かりません.

uses
  SkRegExpW;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := 'テスト用\n\nのテキ\nスト';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LRegExp : TSkRegExp;
begin
  LRegExp := TSkRegExp.Create;
  try
    LRegExp.Expression := '(\\n+)';
    if LRegExp.Exec (Memo1.Lines.Text) then begin
      Memo1.Lines.Text := LRegExp.Substitute('改行記号は$1です');
    end;
  finally
    LRegExp.Free;
  end;
end;

↑ 小宮さんのユニットを使用した例です.
Windows 7 U64(SP1) + Delphi XE(UP1) Pro でやってみました.



INCM/CMT
Cyclamen v3.82