• ベストアンサー

javascriptのmatchで質問です。

javascriptで入力された文字列の中から、指定した文字の前後の文字がアルファベッド、数字、ひらがな、空白かを判断するものを作成しています。 matchを使って作成を行っているのですが、なかなかうまくいっていないのが現状です。 どなたか知恵をお貸しいただけないでしょうか。 よろしくお願いします。 例 指定文字:1 入力:ABCD1EF 出力:アルファベッドです。 指定文字:う 入力:あいうえお 出力:ひらがなです。 指定文字:あ 入力:あいうえお 出力:前が空白で後ろがひらがなです。 という形にしたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.5

#2 です。汎用性を持たせるとして http://jsfiddle.net/JrxR3/ にコードを書いてみました。 ちなみに事例2は「文字列先頭」であって「空白」とは異なりますので先頭(begin)としました。 同じ理由で文字列末尾も end としています。 # このように区別しないと本当の空白「 」と区別が付かなくなります。 全角アルファベット、半角カタカナには対応していませんが、必要であれば function getCharType の内部コードを修正すれば対応できます。 文字コードはGoogle検索したり、 String#charCodeAt で調べてみてください。 # Re: 105atuさん

105atu
質問者

お礼

回答ありがとうございます! 詳しく書いていただき本当に助かりました。 参考になると同時に勉強になりました!

その他の回答 (6)

  • think49
  • ベストアンサー率59% (285/482)
回答No.7

#2,5,6 です。#5 は古いバージョンのURLだったので下記URLに訂正します。失礼しました。 http://jsfiddle.net/JrxR3/4/

  • think49
  • ベストアンサー率59% (285/482)
回答No.6

#2,5 です。数字も対象に入っているようなので対応しました。 http://jsfiddle.net/JrxR3/2/ ■事例1 対象文字列: cccccc 検索文字列: c 結果: 前が begin で後が Alphabet です この事例では c は複数検出される可能性がありますが、初めに一箇所のみ検出する処理としています。 そうしないと単一の結果を返せないためです。 --- 余談。 私は正規表現を使用しない実装としましたが、正規表現で実装する場合はメタキャラクタに気をつける必要があります。 検索文字列を正規表現に組み込む処理において、検索文字列にメタキャラクタが含まれていたらエスケープさせないと検索文字列がメタキャラクタとして機能してしまいます。 --- #3 の方へ。 text.match, isFirst, isLast で3回検索しているようですが、この実装ではそれぞれマッチする場所が異なる場合があります。 対象文字列: cccccc 検索文字列: c 結果: 空白です。 初めの一回で全て検索しきってしまう実装が好ましいと思います。 > var re = text.match( (new RegExp("(.?)"+c+"(.?)")) ); . は改行を除くあらゆる文字にマッチしますので、前後に改行がある場合に期待通りに動作しません。 ^$ もまとめて検出するとして、下記のようにしてみてはどうでしょうか。 new RegExp('?:^|[\s\S])' + escapeRegExpString(c) + '(?:[\s\S]|$)') 空文字が格納された場合に ^$ と判定できます。 > function isAlpha(c){ 他の is**** シリーズにもいえることですが、この処理は部分一致のようですが、is を冠するなら完全一致であることを個人的に期待してしまいます。 この辺の実装は好みかもしれませんので強くは勧めませんが、参考までに。

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.4

思いつくまま書いてみました。未検証なのであしからず。 // TODO 文字が見つからない考慮が不足 文字の場所 = "入力された文字列".indexOf('指定した文字'); // TODO 文字の場所が文頭文末の考慮が不足 前の文字 = "入力された文字列".charAt( 文字の場所-1 ); 後の文字 = "入力された文字列".charAt( 文字の場所+1 ); function これは何ですか(文字){ _ _ if (/[A-Za-z]/.test(文字)) return 'アルファベット'; _ _ if (/[0-9]/.test(文字)) return '数字'; _ _ if (/[\u3040-\u309F]/.test(文字)) return 'ひらがな'; _ _ if (/\s/.test(文字)) return '空白'; _ _ return '何か'; } 前の種類 = これは何ですか(前の文字); 後の種類 = これは何ですか(後の文字); 出力 = 後の種類 + "です。"; if (前の種類 != 後の種類) { _ _ 出力 = "前が" + 前の種類 + "で後ろが" + 出力; }

105atu
質問者

お礼

回答ありがとうございます! 参考になります!

回答No.3

自分に対しても文字種判定の練習になりそうだったので、考えてみました。 前後の1文字を取得して個別に判定するというパターンにしてますけど、これでいいのかどうか。。。 isAlpha(c) || isHiragana(c) || ・・・ という羅列がどうにも気に入らないのですが、これ以上思い浮かばないので。 各関数や判定結果を1つのオブジェクトにまとめて、ブラックボックスにした方がよさそうではあります。 <script> "use strict"; (function(window, document, undefined){ function $(id, val){ var el = document.getElementById(id); if( val!==undefined) { el.value=val; } return el.value; } var _judges=["", "空白", "アルファベット", "ひらがな"]; function isFirst(c, text){ return (new RegExp("^"+c)).test(text)? _judges.indexOf("空白"): 0; } function isLast(c, text){ return (new RegExp(c+"$")).test(text)? _judges.indexOf("空白"): 0; } function isAlpha(c){ return ( /[a-zA-Z]/.test(c) )? _judges.indexOf("アルファベット") : 0; } function isHiragana(c){ return ( /[あ-んを]/.test(c) )? _judges.indexOf("ひらがな") : 0; } function getCharType(c){ return isAlpha(c) || isHiragana(c) || 0; } function judge(){ var c = $('ipt_c'), text = $('ipt_text'), result = ''; var re = text.match( (new RegExp("(.?)"+c+"(.?)")) ); if( re ){ var before = isFirst(c, text) || getCharType(re[1]); var after = isLast(c, text) || getCharType(re[2]); if( before === after ){ result += _judges[ before ] + "です。"; }else{ result += "前が" + _judges[ before ] + "で後ろが" + _judges[ after ] + "です。"; } } $('ipt_out', result); } window.$ = $; window.judge = judge; })(this, document, void(0)); </script> HTMLを含めた全文はこちらで。 http://home.wi-wi.jp/lab/01d/

105atu
質問者

お礼

回答ありがとうございます! 全文載せていただき感謝です。 参考にさせていただきます!

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

アルファベットのケースのみ正規表現を書いてみました。 他の条件は応用してください。 <script> 'use strict'; function escapeRegExpChar (string) { return String(string).replace(/(?=[$()*+\-.?\[]^{|}])/g, '\\'); } function chkAlphabet (string, char) { if (String(char).length !== 1) return false; return new RegExp('[a-zA-Z]' + escapeRegExpChar(char) + '[a-zA-Z]').test(string); } console.log(chkAlphabet('ABCD1EF', 1)) // true console.log(chkAlphabet('AB12EF', 12)); // false </script> # Re: 105atuさん

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

指定文字が入力文字の中に必ず1回(0回でも2回以上でもない)出現する という条件がつくのでしょうか? また前が数字で後がアルファベット的な表示もありうるということでよいですか? 加えてアルファベッド、数字、ひらがな、空白以外の文字が入力される可能性は想定しないのですか?

105atu
質問者

補足

返信が遅れてしまいすみません! 詳しく書かなくて申し訳なかったです。 指定文字が一回以上出現して、アルファベッド、数字、ひらがな、空白以外は基本的に想定してない です。 前が数字、後ろがアルファベッドの表示もありえる方向で考えてます。

関連するQ&A