2013-03-28 13 views
9

Stringの最初の桁のインデックスを取得する方法を調べる必要があります。私はいくつかのループを使用してそれを行うアイデアを持っているが、それは本当に醜いので、私はいくつかの正規表現を好むだろう。誰か私に手掛かりを与えることができる正規表現を使用してそれを行うには?文字列の最初の桁のインデックスを取得する方法

+2

「は、いくつかのループを使用することを行う方法のアイデアを持っているが、それは希望心配だ場合より高速なものがあると確信しています本当に醜いので、私はいくつかの正規表現を好むだろう。誰かが私に手がかりを与えることができる正規表現を使用してそれを行うには? おかしいが、私は「いくつかのループ」を考えるその後、正規表現より読みやすいです.... – Anders

+1

[OK]を、私はむしろ効率的で「醜い」よりも短いとしているはずですが、とにかく文が1よりも優れている場合、いくつかでループと私に教えていません正規表現の行... – Husky

+0

これは非常に正規表現に依存しますが、これはとても単純ですが、他の方法はちょっとばかげているようです。 – VoronoiPotato

答えて

3
firstDigit = 'Testi2ng4'.match(/\d/) will give you the first digit in the string 
indexed = 'Test2ing4'.indexOf(firstDigit) 

でインデックスを見つけるためまあ、私はあなただけ「Testin323g'.search(/ \ D /)を行うことができ、より密接に私の方法を見てする必要があります推測。

+0

ゼロについてはどうですか? – epascarello

+0

は、そして、それを編集した後、あなただけの衣替え\ dは – epascarello

+0

ええ、私はちょっと彼が、私はそれが束のうち最も遅いですので、あなたがその一致/ indexOfのソリューションを選択していない願っています0 – VoronoiPotato

12

検索: [最速の方法]

var str = "asdf1"; 
var search = str.search(/\d/) 
console.log(search); 

マッチ:ループは最速であるため

var str = "asdf1"; 
var match = str.match(/(\D+)?\d/) 
var index = match ? match[0].length-1 : -1; 
console.log(index); 
+1

最初の解決策が検索よりも74%遅い(鉱山が85%遅くなる)のが最も遅いと指摘しているのは楽しいことです。これは、競馬の中でどのカメがより速いかを主張する2人の男性のようなものです。 – VoronoiPotato

+0

http://jsperf.com/indexof-vs-searches – VoronoiPotato

+1

あなたが答えを批評的に見せたいのであれば、あなた自身のレビューをしなければならないでしょう。最初の答えは私にNaN on chromeを与えます。str.searchはオブジェクトではなく整数を返すので、2番目の答えは未定義です。 – VoronoiPotato

0

A [forループよりも遅いが、ちょうどそれを行うための別の方法を示します]正規表現ベースのソリューションよりも:

function indexOfNaN(input) { 
    let i = 0; 
    for (; input[i] >= '0' && input[i] <= '9'; i++); 
    return i; 
} 

オンラインで試してみてください!

jsbench(高いほど良い):

TestCase results for your browser Firefox version 54.0 
Test name    Benchmark results 
indexOfNan    11,175,400 (±2.77) 
regex search    3,787,617 (±5.22) 
regex match    2,157,958 (±6.49) 
regex match + indexOf 1,131,094 (±4.63) 
0

あなただけの1つのライナーを探していた場合は、また、関数型プログラミングのアプローチを試みることができると、次のような何かを行うことができます:

let myStr = "ID12345"; 
let myStrIndex = myStr.indexOf(myStr.split('').filter(x => !isNaN(parseInt(x, 10)))[0]); 

文字列は文字の配列に分割され、フィルタ関数はその配列を数値文字に縮小します。新しい配列の最初の文字は文字列の最初の数字です。その文字のindexOfを使用すると、探しているインデックスが得られます。何の数文字が文字列内に存在しない場合は、結果としての-1インデックスを取得します。もちろん、

。 charが(.filterするパラメータとして多数の機能であれば、あなたも)別のチェックを使用することができます - 私はそれが

関連する問題