職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

JS--文字列の規制表現のマッチテスト

2024年04月07日 | JavaScript
文字列が正規表現とマッチするかテストする

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【testメソッドの使い方】
RegExp オブジェクトの test メソッドは、対象となる文字列が正規表現とマッチするかどうかをテストし結果として論理値を返します。

・書式
正規表現オブジェクト.test(文字列)

引数に指定した文字列が少なくとも一つ正規表現とマッチした場合は true を返します。マッチしなかった場合は false を返します。

サンプル

let regexp = /ball/;
let str1 = 'Go to see a baseball game';
let str2 = 'Make a cake tomorrow';

console.log(regexp.test(str1));実行> true

console.log(regexp.test(str2));実行
> false

正規表現は 'ball' とマッチするパターンです。一つ目の文字列には 'ball' が含まれているので正規表現とマッチします。よって test メソッドは true を返します。

サンプル2

let regexp = /a.e/;
let str1 = 'Go to see a baseball game';
let str2 = 'Make a cake tomorrow';

console.log(regexp.test(str1));実行
> true

console.log(regexp.test(str2));実行
> true

パターンの中でドット(.)が記述された場合は特別な意味を持ち、任意の一文字とマッチします。その為、今回の正規表現は 'a' で始まり任意の一文字が続き、最後に 'e' で終わる文字列とマッチするパターンです。

【グローバルフラグが設定されている】

パターンの最後に g を記述するとグローバルフラグを設定することができます。

/パターン/g

正規表現にグローバルフラグが設定されている場合、 test メソッドを実行し文字列が正規表現にマッチすると、正規表現オブジェクトの lastIndex プロパティの値がマッチした文字列の次の文字のインデックスに設定されます。(グローバルフラグが設定されていない場合は、 test メソッドでマッチしたとしても lastIndex は 0 のままです)。

サンプル

let regexp = /ball/g;
let str = 'baseball and football';

console.log(regexp.test(str));
>> true
console.log(regexp.lastIndex);
>> 8
再び
 test メソッドを実行すると、現在の lastIndex が示す文字列の位置から文字列が正規表現にマッチするのかをテストします。再びマッチした場合は、改めて lastIndex プロパティの値が更新されます。
console.log(regexp.test(str));
>> true
console.log(regexp.lastIndex);
>> 21


サンプル2
test メソッドを実行したときに正規表現にマッチしなかった場合には lastIndex は 0 に戻ります。

let regexp = /ball/g;
let str = 'baseball and football';

while (regexp.test(str)){
  console.log("lastIndex = " + regexp.lastIndex);
}
console.log("lastIndex = " + regexp.lastIndex);

>> lastIndex = 8
>> lastIndex = 21
>> lastIndex = 0

このようにグローバルフラグを設定することで、同じ文字列に対して正規表現が複数回マッチするかどうかテストすることができます。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JS--エスケープ処理

2024年04月06日 | JavaScript

エスケープ処理

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【特別な意味を持つ文字をエスケープする】
正規表現のパターンで使われる文字の中にはドット(.)やプラス(+)などのように特別な意味を持つ文字があります。
これらはメタ文字と呼ばれます。例えば次のような正規表現リテラルで見てみます。

サンプルコード
let regexp = /a.b/;
console.log(regexp.test('oa.bo'));結果> true

console.log(regexp.test('oaxbo'));結果> true

最初に試した 'oa.bo' は文字列の中に a.b という文字列が含まれるのでマッチするのは分かりますが、次に試した 'oaxbo' は文字列の中に a.b という文字列が含まれていないのにマッチしました。 これはパターンの中でドット(.)を記述した場合、このドットは任意の 1 文字とマッチする特別な意味を持つからです。その為、 /a.b/ は 'a.b' だけでなく 'axb' や 'aYb' など「a」で始まり「b」で終わる 3 文字の文字列にマッチします。

サンプル2
let regexp = /a\.b/;

console.log(regexp.test('oa.bo'));
> true
console.log(regexp.test('oaxbo'));
> false

「a」「.」「b」の 3 つの文字が連続している文字列だけにマッチする

なおエスケープを行うために使用するバックスラッシュ(\)も特別な意味を持つ文字なので、バックスラッシュ自身を一つの文字としてマッチさせたい場合は同じようにバックスラッシュを使って '\\' と記述してください。

let regexp = /\\/;

【正規表現リテラルを使用する場合のスラッシュについて】
正規表現オブジェクトを正規表現リテラルを使って作成する場合、正規表現リテラルでは前後をスラッシュ(/)で囲んで記述するため、パターンの中でスラッシュを記述する場合はエスケープ処理が必要となります。

サンプル
a/b のようなパターンを正規表現リテラルを使って記述する場合、次のようにそのまま記述してしまうとエラーとなります。

let regexp = /a/b/;
>> SyntaxError: Invalid regular expression flags

スラッシュの前にバックスラッシュ(\)を記述してエスケープ処理をしてください。

let regexp = /a\/b/;

ただし、
正規表現オブジェクトを RegExp コンストラクタを使って作成する場合(文字列としてパターンを指定する場合)はスラッシュは特別な意味を持たないためエスケープする必要はありません。

let regexp = new RegExp('a/b');

【RegExpオブジェクトのコンストラクタを使用する場合】

正規表現オブジェクトを RegExp コンストラクタを使って作成する場合に、パターンを文字列で指定するときには注意が必要となります。

new RegExp('パターン');

JavaScript の文字列の中でバックスラッシュは文字に対するエスケープを行う文字という特別な意味を持つ文字なので、バックスラッシュ(\)に対してエスケープ処理が必要となります。

例えばパターンの中で \d と記述した場合、バックスラッシュ + d という意味ではなく 0 から 9 までの数字とマッチする特殊な文字としての意味を持ちます。 \d のようなパターンを文字列で記述する場合、バックスラッシュは文字列としてのエスケープ文字ではなくパターンにおける特別な文字とし扱って欲しいので、バックスラッシュの前にバックスラッシュを記述して(文字列としての)エスケープ処理をしてください。

let regexp = new RegExp('\\d');

なお正規表現オブジェクトを正規表現リテラルとして作成する場合はバックスラッシュに対する文字列としてのエスケープは必要はありません。

let regexp = /\d/;

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JS--正規表示

2024年04月06日 | JavaScript

正規表示

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
 
正規表示とは
指定した条件に一致する複数の文字列を一つのパターンで表現する方法です。 JavaScript では正規表現もオブジェクトのひとつです。
 
【正規表現リテラル】
正規表現オブジェクトとは正規表現で使用するパターンを定義することです。最初に正規表現リテラルを使って正規表現オブジェクトを作成する方法です。

・書式
/パターン/
/パターン/フラグ

正規表現のパターンを表す値をスラッシュ(/)で囲んで記述します。
フラグを設定する場合はスラッシュのあとに記述します。

サンプル

let regexp1 = /apple/;
let regexp2 = /[a-zA-Z]{4}/;

一つ目の正規表現オブジェクトは 'apple' とマッチするパターンです。対象の文字列の中に 'apple' と同じ文字列が含まれていればこの正規表現とマッチします。

二つ目の正規表現オブジェクトは特別な意味を持つメタ文字を使って記述したパターンで、アルファベットで構成された 4 文字の文字列とマッチします。

フラグを設定する場合は、フラグを表す値を一つまたは複数記述します。

let regexp1 = /[a-z]{4}/i;
let regexp2 = /[a-z]{4}/im;

一つ目の正規表現オブジェクトには i フラグを設定しており、二つ目の正規表現オブジェクトには i フラグと g フラグを設定しています。

【RegExpコントラスタを使う】
次に RegExp オブジェクトのコンストラクタを使用して正規表現オブジェクトを作成する方法です。

・書式
new RegExp(パターン[, フラグ])
1 番目の引数には正規表現リテラルを指定するか、パターンを表す値を文字列として記述します。

フラグを設定する場合は 2 番目の引数に一つまたは複数のフラグを文字列として記述します。

サンプル

let regexp1 = new RegExp(/lemon/);
let regexp2 = new RegExp('lemon');


どちらも同じ正規表現オブジェクトを作成します。パターンを文字列として指定する場合はスラッシュ(/)で囲う必要はない点に注意してください。

フラグを設定する場合は次のように記述します。

let regexp1 = new RegExp(/lemon/, 'i');
let regexp2 = new RegExp('lemon', 'ig');

正規表現のパターンがあらかじめ決まっているのであれば基本的に正規表現リテラルを使って正規表現オブジェクトを作成するのがシンプルで分かりやすいかと思います。
パターンが決まっていない場合はパターンを文字列として指定できる RegExp コンストラクタを使います。

例文

let regexp1 = /movie/;
let regexp2 = /driving/;
let str = 'I like movies and sports'

console.log(regexp1.test(str));
>> true

console.log(regexp2.test(str));
>> false

RegExp オブジェクトのインスタンスメソッドである test は文字列が正規表現にマッチするかどうかを調べ論理値を返します。

正規表現オブジェクトを 2 つ作成し、対象となる文字列がそれぞれの正規表現オブジェクトとマッチするかどうかを調べました。

対象の文字列には 'movie' が含まれているので最初の正規表現にはマッチしましたが、対象の文字列には 'driving' は含まれていないので次の正規表現にはマッチしませんでした。



 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JS--例外をスローするには

2024年04月04日 | JavaScript

例外をスローするには

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【throw文の使い方】
throw 文を使用すると例外をスローすることができます。
 
・書式
throw 例外の値
 
例外の値には通常 Error オブジェクトを指定しますが、数値や文字列といった任意の値を指定することもできます。 try...catch 文を使って例外がキャッチされた場合、ここで指定した例外の値が catch の括弧の中に記述した変数に格納されます。
 
サンプル
function checkResult(point){
  try{
    if (point < 50){
      throw '不合格です';
    }

    console.log('得点' + point);
    console.log('合格です');
  } catch(e) {
    console.error(e);
  }
}

console.log('Start');

console.log(checkResult(82));
console.log(checkResult(40));

console.log('End');
実行
> Start
> 得点82
> 合格です
> 不合格です
> End
今回のサンプルでは関数内で引数として渡されてきた値をチェックし、 50 未満だった場合には例外をスローしています。今回は例外の値として文字列を指定しています。スローされた例外は try...catch 文でキャッチされて、 catch ブロックの中に記述された処理が実行されます。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JS--例外が発生するエラーの種類

2024年04月03日 | 哲学

例外が発生するエラーの種類

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【例外が発生するえらーの種類】
例外が発生するエラーの種類として次の 8 種類がグローバルオブジェクトとして定義されています。
Error           一般的なエラー
EvalError       eval 関数に関するエラー
InternalError   JavaScriptの内部エラー
RangeError      数値が有効範囲を超えた場合のエラー
ReferenceError  不正な参照を行った場合のエラー
SyntaxError     JavaScriptの構文エラー
TypeError       変数や引数の型が適切ではない場合のエラー
URIError        encodeURIまたはdecodeURIに関するエラー

※ ただし SyntaxError は実行時にエラーとなるのではなく実行前の時点でエラーとなるため、明示的に SyntaxError オブジェクトを作成してスローしない限りは、構文ミスが理由で実行時に例外をスローすることはないと思います。

例文

let num = 10;
console.log(num.toString(100));//toStringの引数は 2 から 36 までの範囲実行> RangeError: toString() radix argument must be between 2 and 36
toFixed メソッドでは
let num = 3.14;
console.log(num.toFixed(1000));//引数の範囲は、0から100まで実行
> RangeError: toFixed() digits argument must be between 0 and 100

let str = '3.14';
console.log(str.toFixed());実行
> TypeError: str.toFixed is not a function

console.log(24.toFixed());実行
> SyntaxError: Invalid or unexpected token

【例外の種類に応じて実行する処理を分ける】
例外の種類が何であっても同じ処理を行いたい場合は次のように記述します。
サンプル

function returnFixed(num, digits){
  try{
    return num.toFixed(digits)
  } catch(e) {
    console.error(e);
    return null;
  }
}

console.log('Start');

console.log(returnFixed(3.87654, 3));
console.log(returnFixed(3.87654, 1000));
console.log(returnFixed('3.87654', 1000));

console.log('End');
実行
> Start
> 3.877
> RangeError: toFixed() digits argument must be between 0 and 100
> null
> TypeError: num.toFixed is not a function> null
> End

今回のサンプルでは try...catch 文が記述された外部の関数を 3 回呼び出しています。
1 回目は正常に結果が返ってきますが、 2 回目と 3 回目はそれぞれ例外が発生しています。
2 回目と 3 回目では発生した例外の種類が異なりますが同じ catch ブロック内で同じ処理を行っています。

発生した例外の種類毎に実行する処理を分けたい場合、 catch のあとの括弧の中に記述した変数 e に格納されている値を調べて条件分岐を行います。

try{
  例外が発生する可能性がある文を記述
  ・・・
} catch(e) {
  if (e instanceof RangeError){
    // RangeError が発生した場合に実行される処理
    ・・・
  } else if (e instanceof TypeError){
    // TypeError が発生した場合に実行される処理
    ・・・
  } else {
    // 上記以外の例外が発生した場合に実行される処理
    ・・・
  }
}

catch のあとの変数には例外がスローされたときに設定された値が格納されます。この値を instanceof 演算子を使って RangeError オブジェクトや TypeError オブジェクトと比較することで例外の種類を特定することができます。

サンプル

function returnFixed(num, digits){
  try{
    return num.toFixed(digits)
  } catch(e) {
    if (e instanceof RangeError){
      console.error('RangeError');
      return null;
    } else if (e instanceof TypeError){
      console.error('TypeError');
      return null;
    } else {
      console.error(e);
      return null;
    }
  }
}

console.log('Start');

console.log(returnFixed(3.87654, 3));
console.log(returnFixed(3.87654, 1000));
console.log(returnFixed('3.87654', 1000));

console.log('End');
実行
> Start
> 3.877
> RangeError
> null
> TypeError
> null
> End
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする