QA@IT

JavaScriptで正規表現を使って、末尾の位置をとりたい。

3044 PV

現在、Crome上でJavascriptを使っています。
そこで、特定の行の末尾が、先頭から見て何文字目にあるかを知りたいと考えているのですが、いいやり方がわかりません。

私がやりたいことの例を挙げると、

abcc
ddeff
afew

という文字列があったとして2行目の末尾が何文字目か知りたいとすると、4+1(改行)+5=10が返ってきて欲しいという感じです。

そこでこのような処理を実現させる関数として、searchメソッドがあることがわかりました。
そこでこのメソッドを使って以下のように書きました。

//target_sには改行入りの適当な文字列が入ってると考えてください。
target_s.search(/(.*\n){2}/);//2は知りたい行数番号

しかしこの結果は0を返します。なぜならsearchはヒットした先頭のindexを返すためです。

そこで改めて質問なのですが、searchの末尾のindexを返す関数か、ほかの書き方等はないでしょうか?

ご回答お待ちしております。

回答

var target_s="abcc
ddeff
afew
";

target_s.match(/(?:.*\n){2}/)[0].length

これで11が返ります(改行コードが\nの場合)。
2行目の最終文字ならここから 1を引くことになります。

ただ、最後の文字の前に改行コードが入っているか不定な場合は

target_s.match(/.*(?:\n.*){1}/)[0].length

になりますかね。
2行目末尾を取るために{1}を指定することになります。
1行目の末尾なら{0}にすれば問題ないと思います。

実際に使う場合正規表現リテラルに変数は仕込めませんので

var line = 2;
target_s.match(new RegExp(".*(?:\n.*){" + (line - 1) + "}"))[0].length;

こんな感じですかね。

\rや\r\nの場合やマッチしない場合は考慮されていませんのでご注意を。

編集 履歴 (1)
  • おお、ばっちりですね。
    長さをとるんですね、盲点でした。
    詳しい解説ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。