2022/08/05

半角英数字以外を削除する

フィールドに入力された文字列にある半角英数字だけ残し、改行やタブを含む「記号」と「全角文字」を削除したいことがありまして、次のようなコードを書いてみました。

Function allowChar_azAZ09( inputStr$ ) As String
	Dim compareChr$, removeChr$()
	Dim strLen&, i%, j%
	
	allowChar_azAZ09 = inputStr
strLen = Len( inputStr ) If strLen = 0 Then Exit Function j = 0
For i = 1 To strLen compareChr = Mid( inputStr, i, 1 ) If compareChr Like "[!a-zA-Z0-9]" Then Redim Preserve removeChr$( j ) removeChr( j ) = compareChr j = j + 1 End If Next If j > 0 Then allowChar_azAZ09 = Replace( inputStr, removeChr, "" )
End If End Function

このファンクションの引数にフォーム上に入力された文字列を与えると、半角英数字だけの文字列を返します。

残したい文字が半角英数字だけなので Like 演算子に [!a-zA-Z0-9] を指定しています。

ちなみに Like 演算子を使う上で注意するべきことが次の Article に書かれています。念のため (Options) に Option Compare Binary を指定した上で大文字小文字のどちらも Like 演算子に明示的に指定しました

LotusScript の like 演算子が常に大文字・小文字を同一とみなす
https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0025874

入力された文字列の最初から1文字ずつ順に取り出し、取り出した文字が削除の対象ならその文字をいったん配列に追加します。入力された文字列を最後の文字まで比較しおわったら、入力された文字列に含まれる配列中の文字を "" に置換して戻します。


フォームから上のコードを呼び出してテストした結果が次のスクリーンショットです。

左枠に文字列を入力して真ん中の矢印ボタンをクリックすると上のコードを呼び出し、戻り値を右枠にセットします。

左枠にある「"あ"、ドット、改行文字、全角スペース、タブ文字、ハイフン、半角スペース、アットマーク、括弧閉じ」が削除されています。


こういったコードは過去に開発したDBで書いた記憶があるのですが実は Like 演算子を使うことは稀で、残したい文字全部を定数に指定しておいて inStr 関数を利用して文字探しすることが多いように思います。上のコードにある Like 演算子の行が次のように置き換わるイメージです。残す文字全部を定数「allowChar」に指定しています。

If Instr( 1, allowChar, compareChr, 0 ) = 0 Then

Like 演算子を使わない理由は一目で理解できないことがあるからですが、コードをシンプルにしたい場合は積極的に使いたいと考えています。どちらのコードがパフォーマンス良いのでしょうね。機会があったら調べてみようっと。

なお、Like 演算子でもなければ LotusScript でもなく@関数ですが、文字の種類を調べるヒントが次の Article に紹介されています。Like 演算子でも使えそう?なのでリンクをおいておきます。

@関数を使用して半角文字や全角文字を判別する方法
https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0028663

0 件のコメント:

コメントを投稿