Paepoi

Paepoi » JavaScript Tips » JavaScript String

JavaScript String

# 最終更新日 2024.01.03

文字列操作
切り出し方法が三つもあるけど気にしないことにしよう
/*
 * 切り出し
 */
const STR = '漢字も一文字だもん!';

let a = STR.slice(3, 6);     // (開始位置 ,終了位置)
let c = STR.substring(3, 6); // (開始位置 ,終了位置)
let b = STR.substr(3, 3);    // (開始位置 ,切り出す長さ)
console.log(`${a}, ${b}, ${c}`);
//=> 一文字, 一文字, 一文字

console.log(STR.slice(3));     // (開始位置のみ指定)
//=> 一文字だもん!

console.log(STR.slice(-4));     // (後方からマイナス指定)
//=> だもん!

/*
 * 検索
 */
STR.startsWith('漢字'); // 最初はコレで始まっているか
//=>true
STR.endsWith('もん!'); // 最後はコレで終わっているか
//=>true
STR.indexOf('も'); // 最初の出現位置、存在しなければ -1 が戻る
//=>2
STR.lastIndexOf('も'); // 最後の出現位置、存在しなければ -1 が戻る
//=>7
STR.includes('もん'); // 含まれている?
//=>true

/*
 * 大文字化、小文字化
 */
console.log('ABCdef'.toLowerCase());
//=>abcdef
console.log('ABCdef'.toUpperCase());
//=>ABCDEF

/*
 * 前後の空白や最後の改行を取り除く
 * 前方のみなら trimStart、後方のみなら trimEnd を使う
 */
let f = '  aa bb cc   \n';
console.log(f.trim());
//=> 'aa bb cc'

// ゼロ詰め
'7'.padStart(4, '0');
//=> '0007'

文字列変換
第一引数で挙動が変わる
let strs = `パナライカのレンズは美しい
パナライカのレンズはカワイイ
パナライカのレンズをペロペロしたい`;

// 第一引数が文字列なら最初に一致した語句のみ変換
console.log(strs.replace('パナライカのレンズ', '五条川のカワセミ'));

// replaceAll が ES2021 で追加、Fedora 35 の Gjs は対応済
console.log(strs.replaceAll('パナライカのレンズ', '隣のお姉さん'));

// 第一引数は正規表現でもいい、g 指定ならマッチしたすべての語句を変換
console.log(strs.replace(/パナライカのレンズ/g, '君のウンコ'));

ファイル名
正規表現での方法、Windows ならスラッシュを置き換え
let fullpath = '/home/sasakima-nao/OM SYSTEM/OM-1 とパナライカ.jpg';
let regexps = {
    'ファイル名': /[^/]+$/,
    'パス名': /^.*\//,
    '拡張子': /[^.]+$/
};

for (let kwd in regexps) {
    let output = fullpath.match(regexps[kwd])[0];
    console.log(`${kwd}: ${output}`);
}

UTF-8 との相互変換
JXA では使えません、というか Uint8Array を使う機会がありません
let str = '文字列をUTF-8に';

// Uint8Array に変換
let encoder = new TextEncoder();
let u8arr = encoder.encode(str);
console.log(u8arr);
  
// JavaScript 文字列に変換
let decoder = new TextDecoder();
let jsStr = decoder.decode(u8arr);
console.log(jsStr);

コードポイント
Python の chr ord 相当、ちなみに Python はサロゲートペア問題は無い
// コードポイントを UNICODE 文字に変換、Python では chr(97)
String.fromCharCode(97);
//=> 'a'

// UNICODE 文字をコードポイントに変換、Python では ord('a')
// 引数の数値は先頭から何番目か、一文字ならゼロでいい
'a'.charCodeAt(0);
//=> 97

// サロゲートペアにも対応関数、UTF-16 範囲は上記と同じ結果になる
String.fromCodePoint(9940);
//=> '⛔'
'⛔'.codePointAt(0);
//=> 9940

ループと配列
for of ループはサロゲートペア、emoji に対応
// 一文字ずつ取り出す
for (let s of '🎴あ⛔') console.log(s);

// bash のように空白区切りにしたい場合は配列化
let suzuki = 'パナライカの レンズは カッコイイ';
let suteki = suzuki.split(' ');
for (let s of suteki) console.log(`!!!${s}!!!`);

// Nunber 交じりの配列を合体すると文字列化される
console.log(['GSX-R', 1000, 'R'].join(''));

テンプレートリテラル
もう文字列を + 記号で合体という読み辛いコードはヤメましょう
// 普通の変数を ${} で囲んで使います
let val = 'シングルクォート';

// Python の r'' 同様にエスケープシーケンスを無視するには
let raw = String.raw`この \n は改行されない`;

// ヒアドキュメントとほぼ同様
console.log(`バッククォートで囲みます
${val}ではありません
改行部は普通に \\n になります
${raw}`);

/* output
バッククォートで囲みます
シングルクォートではありません
改行部は普通に \n になります
この \n は改行されない
*/

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.