参照:「正規表現の基礎」
正規表現に関しては、多くの解説書やWebサイトがあります。ここで取り上げたものは一部分にすぎず、しかも初歩的なものです。あえてこれを作成したのは、script作成時にうまく処理できなかったときのテスト用にしたかったからです。
「出力行 = 入力文.split(分割文字列);」とすると、入力文が分割文字列(例えば「,」)の前後で分割されて、出力行[0], 出力行[0], ・・・の配列になります。
出力行の行数は「出力行.length」で得られます。分割文字列が存在しないと、行数は1になり、出力行[0] が入力行と同じになります。
確かではないのですが、「,」の後にある(出力行の左端)の半角空白は削除され、「,」の後にある(出力行の左端)に複数の半角空白があっても1個になるようです。
入力文.substring( // A 入力文.indexOf(左端文字), // B 入力文.indexOf(右端文字) + 右端文字.length) // CAの入力文.substring(左端位置, 右端位置)の左端位置、右端位置をB・Cで与えています。
入力文.substring( // A 入力文.indexOf(左端文字) - 左端文字.length, // B 入力文.indexOf(右端文字)) // Cこの場合でも、入力文を左から探索して最初に見つかった左端文字・右端文字の位置が対象になります。そのため、右端文字が左端文字より左にあると面倒になります。
「_」は半角空白、□は全角空白を示します 半角空白のみ削除 全角空白も削除 全体を対象 _ \s または [_□] 行頭・行末だけを対象 ^_+|_+$ ^\s+|\s+$ |
文法では、文字クラス「\s」は「半角空白を指し、全角空白は含まない」としています。
ところが、
"__□_abcde□□__fghij__□_".replace(/\s/g, "x") → "xxxxabcdexxxxfghijxxxx"
"__□_abcde□□__fghij__□_".replace(/_/g, "x") → "xx□xabcde□□xxfghijxx□x"
となります。
すなわち、「\sは半角・全角どちらの空白も含む」ようです。
私は、この理由がわかりません。ご教示いただければ幸甚です。hitoshi@kogures.com
上の文章を、そのまま取り込んで「入力文」とします。
(alert)
入力文をalertで表示すると、フレームと同じ改行や空白行が表示されます。
(getElementById)
ところが、「document.getElementById("複数行表示場所").innerHTML = 入力文」としたとき、1行で表示されます。
その理由は、テキストデータの改行コードは、Windowsでは「\r\n」その他OSでは「\n」ですが、HTMLでは、<br>などのタグが改行をコントロールします。ケース2では改行コードは残っているのに、「改行」の機能をもたないのです。
(relpace)改行コードの削除
入力文を正規表現などで加工するとき、改行コードを削除して1行にしたほうが取扱いが容易になるので、まず改行コードを削除するのが常套手段です。
入力文 = 入力文.replace(/[\r\n]/g, "");
[\r\n] とは、\r または \n の意味で、どちらのコードも "" になります。
ここでは、結果をalertで表示します。改行コードがなくなり1行になります。
(split)各行の配列化
改行コードを分離コードとして、入力行を各行の配列にします。
「\r」の削除: 入力文 = 入力文.replace(/\r/g, "");
「\n」による分離: 行 = 入力文.split("\n");
ケース4+空行の削除
ここでの空行とは、半角空白あるいは全角空白(□で表示)だけの行も含むものとします。
(上の入力文の3行目に適宜半角・全角の空白を入れてテストしてください)
半角空白の正規表現は「\s」ですが、全角空白も対象にするので、「[\s□]」を削除します。
仮行 = 行.replace(/[\s□]/g, "");
により、仮行が空白行ならば、仮行="" となるので、その行を読み飛ばせばよいのです。
var 新行 = new Array(); // 空白行を除いた行を新設 var j = 0; // 新行配列の添字 入力文 = 入力文.replace(/\r/g, ""); // \r の削除 行 = 入力文.split("\n"); // \nによる分離 for (i=0; i<行.length; i++) { var 仮行 = 行[i].replace(/[\s□]/g, ""); // 空白の削除 if (仮行 != "") { 新行[j] = 行[i]; j++; } }
入力 URL: "aaa/bbb/xxx.html" "xxx.html" 出力 パス: "aaa/bbb/" "" ファイル:"xxx.html" "xxx.html"
var パス = ""; var ファイル = URL; var 正規表現 = new RegExp("/","g"); // A if (URL.match(正規表現)) { // B パス = RegExp.leftContext + "/"; // C ファイル = RegExp.rightContext; // D }
ここでは( )で囲まれた内部だけを取り出します。
検索1と検索2の間に文字列がある部分、ここでは「英小文字列 + あ + 数字列」を取り出します。
検索1での文字列(「英小文字列」の部分)がRegExp.$1、検索2での文字列(「数字列」の部分)がRegExp.$2に得られます。
ここでは、「円」の直前の数字列を取り出します。→\d+(?=円)