4

searchedUrl文字列を検索するための正規表現を JavaScript で作成しました。

var input = '1234 url(  test  ) 5678';
var searchedUrl = 'test';

var regexpStr = "url\\(\\s*"+searchedUrl+"\\s*\\)"; 
var regex = new RegExp(regexpStr , 'i');

var match = input.match(regex);
console.log(match); // return an array

出力:

["url(            test  )", index: 5, input: "1234 url(            test  ) 5678"]

ここで、 の位置を取得したいと思いますsearchedUrl(上記の例では、 の位置 testです1234 url( test ) 5678

どうやってやるの?

4

5 に答える 5

2

JS には、サブパターン/キャプチャ グループのインデックスを直接取得する方法がありません。しかし、いくつかのトリックでそれを回避できます。例えば:

var reStr = "(url\\(\\s*)" + searchedUrl + "\\s*\\)";
var re = new RegExp(reStr, 'i');

var m = re.exec(input);
if(m){
    var index = m.index + m[1].length;
    console.log("url found at " + index);
}
于 2013-06-11T08:57:58.133 に答える
1

インデックスは必要ありません。

これは、もう少し情報を提供することで、はるかに優れた回答が得られるケースです。私はそれについてあなたを責めることはできません。単純なテスト ケースを作成し、無関係な詳細を削除することをお勧めします。

しかし、重要な項目が 1 つ欠けていました。それは、そのインデックスで何をするつもりかということです。その間、私たちは皆、間違った問題を追いかけていました。:-)

何かが足りない気がしました。それが私があなたにそれについて尋ねた理由です。

コメントで述べたように、入力文字列で URL を見つけて、何らかの方法で強調表示する必要があります。おそらく、<b></b>タグなどでラップします。

'1234 url(  <b>test</b>  ) 5678'

(「ハイライト」とは何か他のことを意味する場合はお知らせください。)

文字インデックスを使用してそれを行うことができますが、正規表現自体を使用するより簡単な方法があります。

インデックスの取得

しかし、あなたが尋ねたので、インデックス必要な場合は、次のようなコードで取得できます。

var input = '1234 url(  test  ) 5678';
var url = 'test';

var regexpStr = "^(.*url\\(\\s*)"+ url +"\\s*\\)"; 
var regex = new RegExp( regexpStr , 'i' );

var match = input.match( regex );
var start = match[1].length;

これは他の回答のコードよりも少し単純ですが、どれも同様にうまく機能します。このアプローチは、正規表現を文字列の先頭に固定し^、URL の前にあるすべての文字を(). そのグループ文字列の長さ がmatch[1]インデックスです。

スライスとダイシング

test文字列の開始インデックスがわかったら、.slice()または他の文字列メソッドを使用して文字列を切り取り、タグを挿入できます。おそらく次のようなコードを使用します。

// Wrap url in <b></b> tag by slicing and pasting strings
var output =
    input.slice( 0, start ) +
    '<b>' + url + '</b>' +
    input.slice( start + url.length );

console.log( output );

それは確かに機能しますが、実際には難しい方法で行っています。

また、いくつかのエラー処理コードを省略しました。一致する URL がない場合はどうなりますか? matchになりundefinedmatch[1]失敗します。しかし、それについて心配する代わりに、文字の索引付けをまったく行わずにそれを行う方法を見てみましょう。

簡単な方法

正規表現に任せてください。ここにすべてがあります:

var input = '1234 url(  test  ) 5678';
var url = 'test';

var regexpStr = "(url\\(\\s*)(" + url + ")(\\s*\\))"; 
var regex = new RegExp( regexpStr , 'i' );

var output = input.replace( regex, "$1<b>$2</b>$3" );

console.log( output );

このコードの正規表現には 3 つのグループがあり、1 つは URL 自体をキャプチャするためのもので、URL の前後に他の一致するテキストをキャプチャするためのグループがあるため、それを失うことはありません。次に、簡単.replace()で完了です。

このように、文字列の長さやインデックスについて心配する必要はありません。URL が見つからない場合、コードは正常に機能します。入力文字列を変更せずに返します。

于 2013-06-11T08:55:22.573 に答える