【UWSC】正規表現、マッチしているかどうかテスト

UWSCで正規表現を使ったマッチしているかどうかのテスト

-------------------------------------------------
re=CreateOleObj("VBScript.RegExp")
re.pattern = ";$" //正規表現のパターン。行末に「;」があればマッチ。
re.Global = True //文字列全体を検索。trueでする(規定)、falseでしない(マッチする文字列が見つかったらそこで終了)。
re.IgnoreCase = True //大文字・小文字を区別。trueでしない(規定)、falseでする。

str = "aaaaa;" //対象の文字列

IFB True = re.Test(str) THEN
PRINT "マッチしている"
ELSE
PRINT "マッチしてない"
ENDIF
-------------------------------------------------

【UWSC】正規表現を使ってマッチした文字列を取り出す

正規表現を使ってマッチした文字列を取り出したい。

UWSCでの正規表現はVBScriptを用いる。

-------------------------------------------------------------
moji = "1234567891000520005" //対象となる文字列

re=CreateOleObj("VBScript.RegExp")
re.pattern = "1.*5" //正規表現パターン。1と5の間の文字を取り出す。
re.Global = True //文字列全体を検索。trueでする(規定)、falseでしない(マッチしたらそこで終了)。
re.IgnoreCase = True //大文字・小文字を区別。trueでしない(規定)、falseでする。
match = re.Execute(moji)

//マッチしたものをすべて出力
for i = 0 To match.Count-1
print match.Item(i).Value
next
-------------------------------------------------------------

出力結果:1234510005

【mysql】特定の長さの文字列だけをselectで取り出す

フィールドの中の、特定の長さのレコードだけを取り出す場合の記述

SELECT * FROM table1 WHERE LENGTH(field1) > 60

【PHP】正規表現で置換できない。ereg_replaceとpreg_replaceの記述の違い。

マニュアルどおりやった(つもりだった)んだけどなぜか正規表現の置換がうまく行われない。

記述したのはこれ↓

--------------------------------------------------------------
<?php
$moji ="123456789";
$moji = ereg_replace("/^123/", "aaa",$moji);

echo $moji;
?>
--------------------------------------------------------------

$mojiから先頭の「123」を「aaa」に置き換えるというもの。
期待した結果は「aaa456789」なんだけど、実際の結果は「123456789」。変化無し。マッチしていない。

でいろいろ試行錯誤した結果、単純なミスに気付く。

PHPで正規表現を用いた置換を行う場合は、次の二つの関数がある。

・ereg_replace
・preg_replace

どちらも同じ仕事をするので記述にも違いがないと勝手に思っていたが、そうでないと判明。

正しい記述例
・ereg_replace("パターン", "置換文字",置換前の文字列);
・preg_replace("/パターン/", "置換文字",置換前の文字列);

つまりpreg_replaceの第一引数はパターンを//で囲む必要があるが、ereg_replaceは//で囲む必要がない。

なので最初の失敗は//を取り除くことで解決する

ereg_replace("^123", "aaa",$moji);

出力結果 aaa456789

ただしereg_replaceは将来的になくなる関数らしいので、今後はpreg_replaceを使っていく。

mysqlの正規表現で括弧()をマッチさせる

mysqlの正規表現で括弧()をマッチさせるには、エスケープシーケンスを連続して記述する。(\\)

下記は 行頭が (11) の文字列にマッチさせる場合。

REGEXP '^\\(11\\)'

エスケープシーケンス(\)が1つの場合はMySQLに対するエスケープとみなされる。
正規表現としてのエスケープするために、2つ並べている。

PHPファイルの中にsql文を記述する場合は、「\」が四つ並んだりする

$sql = "SELECT field FROM table WHERE field REGEXP '^\\\\(11\\\\)'";

mysqlで正規表現を使って置換する方法

mysqlは正規表現のREGEXP関数、置換のREPLACE関数があるが、同時に使えない。

なのでPHPを組み合わせて利用する方法を取る。

次のPHPスクリプトでは、field1 に入っている文字列が「;」で終わっていた場合に、その部分だけを削除している。

--------------------------------------------------------------------------
<?php
$pattern = ";$"; //正規表現のパターン

//mysqlの正規表現を使ってUPDATEの対象になるレコードを取り出す。
$sql = "SELECT field1 FROM table1 WHERE field1 REGEXP '" . $pattern . "'";
$result = mysql_query($sql) or die(mysql_error()); //sqlを実行

//全て展開
while ($item = mysql_fetch_array($result)) {
$in_data = $item['field1'];
$out_data = preg_replace( "/" . $pattern . "/", "", $in_data); //PHPで置換
$new_sql = "UPDATE table1 SET field1 = '".$out_data."' WHERE field1 = '".$in_data."'"; //置換した文字列をUPDATEするsql文
mysql_query($new_sql) or die(mysql_error()); //sqlを実行
}
?>
--------------------------------------------------------------------------

このファイルをサーバーにアップロードして、ブラウザでアクセスすればPHPおよび、mysqlが実行される。

【mysql】特定のフィールドで重複しているレコードを削除する

たとえば"field1"でレコードが重複しているので、一つを残してその他を削除したいときの手順。

1.field1をグループ化して、重複データを1つにまとめる。その状態のテーブルをコピー。

//グループ化してcopy_tableという名前のテーブルを作った。
CREATE TABLE copy_table as SELECT * FROM main_table GROUP BY field1

2.メインテーブルを削除。(くれぐれも自己責任で!)
DROP TABLE main_table

3.コピーしたテーブルをメインテーブルにリネーム。
ALTER TABLE copy_table RENAME TO main_table

uwscで正規表現を使う(文字列最後の「,」を削除する方法)

UWSCで正規表現を使うには、VBScriptを利用する必要がある。

aaa,bbb,ccc,ddd

↑文字列最後、dddの後ろの「,」だけを消したい場合の記述は次のとおり。

--------------------------------------------------------
moji = "aaa,bbb,ccc,ddd,"

re=CreateOleObj("VBScript.RegExp")
re.pattern = ",$" //パターン。$は行末の意味。文字列最後の「,」を指定している。
re.Global = True //文字列全体を検索。trueでする(規定)、falseでしない(マッチしたらそこで終了)。
re.IgnoreCase = True //大文字・小文字を区別。trueでしない(規定)、falseでする。
moji = re.Replace(moji,"") //指定の文字を空文字に置き換えて削除。

print moji
--------------------------------------------------------

出力結果:aaa,bbb,ccc,ddd