- ベストアンサー
部分文字列に一致する番号を返す。
お世話になります。 function StrNoTbl(Str,No){ this.Str=Str; this.No=No; } var htmlStr=new Array( new StrNoTbl('aaa',1), new StrNoTbl('bbbbbb',7), new StrNoTbl('cc',5) ); などと、配列を定義して、 ChkStr="xxxaaaxxx.html#xxx"; と、いう文字列に対して 1 を返す。 ChkStr="xxxccxxx.html#xxx"; に、対して 5 を返すなんてことできるのでしょうか。 for(){}で、やれば、できるのですが、 配列が大きいと、タイムロスが大きくなってしまいます。 正規表現で、できると思うのですが、よくわかりません。 なんとかご教示願えないでしょうか。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
| と、いうことで、9が返ることを期待したのですが、 | 残念ながら、undefindでした。 あう・・・それは確かにundefindにしかならないです(__; /^xxx(.+)xxx.html#xxx$/ の「x」は、xという文字そのものを意味してますから・・・ なのでマッチング処理の結果、該当はしないので(.+)に対応する位置の文字列は無し。従って tmlStr[''] を要求し、結果は「そんなの定義されとらんよ」となった訳です。 もし、 page_helth.html#top から helth を取り出すなら /.+_(.+)\./ ならマッチ可能です。 但し、 pagehelth.html#top や page_heltha.html#top からは取り出せません。 正規表現の場合、「法則性」が無い場合にはちょっと無理ですねえ。 もうすこし、「やりたい事の目的」が解れば、別の面からのアプローチもありますが、これだけの情報では、ここらが限度です・・・。 PS. たぶん、ループのロスタイムは、質問者さんが予想しているほど大きくは無いと思います。 だいたい、時間をロスするのは、画面表示処理の部分です。 まぁ、千やそこらのループでしたら、どうと言う事はないですねぇ。 もし、この処理自体がループの中へ入るという事でしたら、全体の構造を再考してみる方が良いかもしれませんねぇ・・・。
その他の回答 (3)
- NTJ
- ベストアンサー率44% (46/103)
#1さんへの補足です。 /** ChkStr="xxxaaaxxx.html#xxx"; ChkStr="xxxccxxx.html#xxx"; 等から部分を取り出し、対応番号を返す。 */ var htmlStr = new Array(); htmlStr['aaa' ]=1; htmlStr['bbbbbb']=7; htmlStr['cc' ]=5; function fA(ChkStr){ var wk=ChkStr.match(/^xxx(.+)xxx.html#xxx$/); return htmlStr[RegExp.$1]; } おしまい(^^; もし、xxxの部分が可変な場合には、それなりの工夫は必要になってきますが。 まぁ、法則性があるなら、上記のアレンジでなんとかなるかと。
お礼
NTJさん、ありがとうございます。 これならできそうと思い早速やってみました。 var htmlStr = new Array(); htmlStr['index' ]=2; htmlStr['map']=3; htmlStr['course' ]=6; htmlStr['4seasons' ]=6; htmlStr['helth' ]=9; htmlStr['events']=12; htmlStr['topics']=21; function fA(ChkStr){ alert(ChkStr); //page_helth.html#top OK var wk=ChkStr.match(/^xxx(.+)xxx.html#xxx$/); alert(htmlStr[RegExp.$1]); //undefind return htmlStr[RegExp.$1]; //表示されない alert("aaaa"); //表示されない } var ChkStr="page_helth.html#top"; alert(fA(ChkStr)); //undefind と、いうことで、9が返ることを期待したのですが、 残念ながら、undefindでした。 何がundefindなのか、もしできましたら、教えていただけないでしょうか。 すみません。よろしくお願いします。
<script type="text/javascript"> var htmlStr=[['aaa',1],['bbbbbb',7],['cc',5]]; var ChkStr=['xxxaaaxxx.html#xxx','xxxccxxx.html#xxx']; // if ChkStr[0] if(ChkStr[0].indexOf(htmlStr[0][0])!=-1){ alert(ChkStr[0]+' = '+htmlStr[0][1])}else {alert('No match')} </script>
お礼
xepharosさん、早速レスありがとうございます。 私の書き方が抽象的で申し訳ありません。 調べたい文字列を配列に入れてと、いうような 場合とも少し異なるものですので、
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
配列の中のStrNoTbl オブジェクトで文字列と数値の対応を保持しているので、配列を走査するしかないと思います。 "xxxaaaxxx.html#xxx"; からaaa の切り出しが正規表現などで簡単にできるのであれば、 StrNoTbl["aaa"]=1; のようなハッシュを使うのがいいんではないかと思います。 そうでなければ、保持している文字列の配列を逐次indexOf( ) などで調べるしかないように思います。 勘違いコメントだったらすみません
お礼
BLUEPIXYさん、早速のレスありがとうございます。 >保持している文字列の配列を逐次indexOf( ) などで調べるしかないように思います。 そうですか。 まだまだ、使えない正規表現で、即マッチングする方法なんてのは、ないものかと思ったのですが、難しいようですね。
お礼
NTJさん、ご親切にレスありがとうございます。 >だいたい、時間をロスするのは、画面表示処理の部分です。 そうですか。 JavaScriptらしく?、と、いうか、スマートにと、思いましたがなかなか難しいものですね。 多くのことを教えていただきありがとうございました。