プログラミング

正規表現 まとめメモ


.  (改行を除く任意の1文字)
+  (直前のパターンの、1回以上の繰り返し
*  (直前のパターンの、0回以上の繰り返し 。。つまりは無くてもOK Dosのワイルドカードとは違うので注意
?  (直前のパターンの、0回または1回)


・繰り返し回数指定
{n}
{n,}
{n,m}


^   行の先頭からという指定
$   行の最後という指定

() グルーピング
[] 角カッコ内の一文字
[^] 角カッコ内の一文字以外

グルーピングの例
(いた+)+
  いた、いたた、いたたいたた がヒット
  いたい、はヒットしない


正規表現簡易リファレンス。

●条件式 [Perl]
 =~ マッチしたとき。
 !~ マッチしないとき。

 $xxx =~ /abc/
 $xxx !~ /abc/

●メタ文字(基本)
 . 改行を除く任意の1文字
 * 直前のパターンの0回以上の繰り返し
 + 直前のパターンの1回以上の繰り返し
 ? 直前のパターンが0回または1回

 Windowsでよく使う "*txt" とかの検索は、正規表現では、 ".*txt"

●メタ文字(\系)
 \n 改行
 \t タブ
 \r キャッジリターン
 \w 英数字単語。[a-zA-Z0-9_]  (秀丸では、+ が入る。つまり1文字ではなく英単語として [a-zA-Z0-9_]+ にマッチ する)

 Windowsの改行コードは本当は "\r\n"。
 でも、Windowsで "\n"指定の場合、"\r\n"マッチする場合が多い。
 Unixサーバー上のCGI(Perl)の場合は "\r\n" にしないとマッチしない。

●メタ文字(\系) 
 \d 数字。[0-9]
 \D \d以外の文字
 \s 空白。[ \t\n\r\f]
 \S \s以外の文字
 \W \w以外の文字

●位置指定
 ^ 先頭
 $ 最後

 "^●.*" → ●で始まる行
 "。$" → 。で終わってる場所

●文字クラス
 [ABC] 文字クラス化。要は、OR 検索。
 - 範囲
 ^ はじめに使えば否定

 [ABC] → A,B,Cのどれか。
 [0-9] → 0~9の数字のどれか。
 [^ABC] → A,B,C以外の文字。

●オプション [Perl]
 i 後につけて、大文字/小文字区別なし。
 m はじめにつけて、区切りに違う文字を使う。

 $SearchTarget =~ /ABC/i
 $SearchTarget =~ mABC#i


●正規表現 日付時刻
[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} 



よく使う(使いそうな)エスケープ文字

\t	タブ
\n	改行
\<  単語の最初
\>  単語の終わり


否定

	[ ] の中に ^ を書くと否定となる。
		例 <[^<>]+>
			でhtml の単独のタグなどを指定できる。
			(こうしないと、1行に複数またがるタグ間の本文が削除されてしまう。

いろんな例
	行末のタブやスペースを除去する
		検索 [ \t]+$
		置換 何も書かない


	num1~num4 という単語にマッチさせる tmp_num とかはマッチさせない
		\<num[0-4]
	

タグ付き正規表現
	これを使いこなせば強力な置換機能になりそう。
	
 まず正規表現上に \f  をいれる事で、そのパターンにマッチした範囲を区切る事ができる。(最大10区切り)
 そして、置換側で \0 ~ \9 でそれを指定できる。
 
 	例 my_~~  の変数を、 our_~~ に置換する。
 	
 		検索  \<my_\f[_A-Za-z0-9]+
 		置換  our_\1
 		
 		\f は正規表現の検索上は影響を受けない \<my_[_A-Za-z0-9]+ と書いた結果と同じ
 		\0 と \1 (0から始まるのに注意) に区切られて  my_ が\0  その後の文字が \1 となる
 			our_\1 とする事で、全て our_~~ に置換している。


	
	実際に以下を、やった
		[] でくるまれた文字を、[]を取り除く
			検索  \[\f.*\f\]
			置換  \1

	C++/JAVAのソースを全コメント化
		検索  ^.*
		置換  //\0
	
	C++/JAVAのソースを全コメント解除
		検索  ^//\f.*
		置換  \1



' '(スペース)で始まらない行の最後に、全て~ をいれる(Wiki対応)

	 	検索  ^[^ ].*[^\n]$
 		置換  \0~


行の先頭に " "(スペースを入れる)

		検索 ^.*
		置換  \0   ・・・スペース\0


"  " でくるまれた文字列の前半のスペースを取り除く
		検索 "\f *\f[^ ]*
		置換 \0\2


末尾の空白を取り除く・・・多分もっといい方法ある。
		検索 [^ ]*\f *$
		置換 \0

末尾のTABを取り除く・・・フォーマットの違うExcel同士の貼り付け時に
		検索 [^\t]*\f\t*$
		置換 \0



改行を含む、不要な文字を削除する。(以下例は、ExcelでCSVに保存した際にできあがる不要な行を削除)
		検索  ,,,,,,\n
		置換   (何も無し)



() の中身を "くくりから、 'くくりに変更する。
		検索  Value\("\f[^)]*\f"\)
		置換  Value\('\1'\)


命名規則違反分の置換 TXからITへ
			(VBのコントロールだけを取り出す為に、. スペース _  の3つを排除している。
			
		検索:TX\f[^. _"]+
		置換:IT\1


末尾に, を加える
		
		検索:(?<!,)\n
		置換:,\n
		
		  ・・・注意 戻り読みの部分が無いと、永久に改行を置換し続ける事になる。


SQL文を作る。(SQL Turbo Bridge と同等機能)

		検索:^.*$
		置換:SqlStr = SqlStr & "\0 "


.NETでのコーディングミス
 !Convert.IsDBNull(row.BUKACD)
 ↓
 (!row.IsBUKACDNull())
 
 への是正
 
 		検索:Convert.IsDBNull\((\w)\.(\w)\)
 		置換:\1.Is\2Null()


0xのついていない16進数表現 スペース区切りを
0xAA, のように変換する(javaソースコード用)

		検索:[0-9A-F][0-9A-F]
		置換:(byte)0x\0,


Yahooの出馬表 から馬名のみ
		検索:(牝|牡).*\n
		置換:
	
	それに、"..", とする。  スペースと" と 改行以外に最低ひとつマッチさせ "馬名", (rubyスクリプト用)に変更
		検索:[^" \n]+
		置換:"\0",



■"(ダブルクォーテーション)囲みCSV内に、データとして"が含まれている箇所を探す正規表現

[^,]"(?!,)\S

先読み(lookahead)の機能は、秀丸では HMJRE.DLL でサポートされている。
ただし、改行(\n)を含む場合 うまく動作してくれない。
VisualStudio の検索機能では、サポートされていないようだ。
したがって、末尾の" をヒットさせない為に、\S を入れている



C# プライベート変数宣言から、コピーコンストラクタのロジックを作る。
private string _note = string.Empty;
↓
this._note = cpObj._note;

	 	検索:.*(_.*) =.*
 		置換:this.\1 = cpObj.\1;


全角数字のみを検索(最後に改行が前提) ・・SQLでデータを取り出してから実行
\t[0-9]+\n



指定の位置で改行
 FBデータ等で
	 	検索:.{120}
 		置換:\0\n


半角の英数文字と漢字が混ざっている文書で、漢字だけを検索したい
 正規表現で「[亜-黑]」を検索
	[解説] 
	なお、最後の漢字は区点コードで次のようになっているようです。 
 
	体系  最後の漢字( 区点コード、 漢字)  
	新JISのための変更  8406  煕  
	98拡張漢字   9278  黑  


	その他
	
	[ァ-ヶ] 全角カタカナにマッチ 
	[ -~] 任意の1バイト文字(半角空白" "から"~"まで)にマッチ 
	[亜-黑] 漢字にマッチ (詳細は●漢字だけを探したい を参照) 

--------------------------------------------------------------------------------
  htmlのタグ除去
		検索 <[^>]+>
		置換 無し

  2次元配列の入れ替え
		検索 array\[\f[^\]]+\f\]\[\f[^\]]+\f\]
		置換 array[\3][\1]



拡張されている正規表現

・繰り返し回数指定
{n}
{n,}
{n,m}

繰り返し指定その1(固定回数)
特定の正規表現パターンをn回繰り返す場合には、{n}を使います。nの部分には数値が入ります。
例えばabcを3回繰り返すには、(abc){3}と記述します。

数字を5回繰り返すには、[0-9]{5}と書きます。

繰り返し指定その2(n回以上)

特定の正規表現パターンがn回以上出てくることにマッチさせるには、{n,}を使います。
nの部分には数値が入ります。例えばabcが3回以上繰り返すには、(abc){3,}と記述します。

繰り返し指定その3(n回以上、m回以下)
特定の正規表現パターンがn回以上m回以下出てくることにマッチさせるには、{n,m}を使います。
nおよびmの部分には数値が入ります。



・先読み(lookahead)
(?=expression)
(?!expression)
(?<=expression)
(?<!expression)


後方一致指定
特定の正規表現パターンの後に、さらに特定の正規表現パターンが続くことを指定しつつ、
正規表現にヒットする文字列としては前方部分のみとするような指定が出来ます。

例えば、「abcxyz」という文字列を検索しつつ、ヒットする文字としては「abc」だけにしたいようなケースに使います。
普通の検索では必要ありませんが、強調表示や置換の時に使うと便利です。
例えば「abc」の後に「xyz」が続きつつ、ヒットする文字列は「abc」だけにしたい場合は、
	abc(?=xyz)
と指定します。



\d{2}:\d{2}:\d{2}(?=.*XXXX更新  処理)



後方不一致指定
後方一致指定とは反対に、後方部分が特定のパターンにヒットしないことを必要とします。
例えば「abc」の後ろが「xyz」でない場合に「abc」のみにヒットさせたいようなケースで使います。
上記例では、
	abc(?!xyz)
と指定します。


前方一致指定
特定の正規表現パターンの前に、さらに特定の正規表現パターンが存在していることを指定しつつ、
正規表現にヒットする文字列としては後方部分のみとするような指定が出来ます。

例えば、「abcxyz」という文字列を検索しつつ、ヒットする文字としては「xyz」だけにしたいようなケースに使います。
普通の検索では必要ありませんが、強調表示や置換の時に使うと便利です。
例えば「abc」の後に「xyz」が続きつつ、ヒットする文字列は「xyz」だけにしたい場合は、
	(?<=abc)xyz
と指定します。

前方一致指定は、正規表現文字列の先頭に書く必要があります。
また、前方一致指定の表記自体をカッコで囲んだり「|」などと組み合わせることは出来ません。
そういう指定をしてもエラーにはなりませんが、間違った検索を実行してしまいます。

検索系コマンドでの次候補/下候補系コマンド実行時の注意:
 例えば上記のような検索例で、「abcxyz」の先頭からではなく、
例えば「b」の部分から検索を開始した場合、残念ながらHmJre.dllではxyz部分にうまくヒットしません。
xyz部分にヒットさせるには、abcxyzの先頭から検索する必要があります。



@ 逐語的文字列リテラル  について・・・.NET の正規表現

(@"\d+\.\d+\.\d+\.\d+");

@が無ければ
"\\d+\\.\d+\\.\\d+\\.\\d+"  としなければならない。



【秀丸】秀丸エディタの正規表現置換で、一致部分を引用する方法。
めも。
例のごとく普通に「$1」とかで参照出来るのかと思ってたら、秀丸は「\1」なのね。

-プログラミング