• ベストアンサー

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

  • javascriptで質問があります!

    こんにちは。 javascriptで、入力された文字列から指定された文字を含む行を抜き出すプログラムを作りたいです。 例: 入力された文字列 : abcd             efghi  指定した文字    :b 出力         :abcd こんな感じのプログラムを作りたいです。正規表現を使えばいけるのかなと思うのですがどなたか知恵をお貸しいただけないでしょうか? よろしくお願いいたします。

  • javascriptの複数マッチで質問です。

    javascriptを使って入力された文章を配列に格納し、条件にあったものを全て表示するものを作成したいのですが、複数マッチの部分がよくわからなく困っています。 下記のプログラムは配列に格納したところまでなんですが複数マッチのところで躓いてしまいました。for文の部分に複数マッチに相当するものを入れれば動くと思ったのですがうまくいかないのが現状です。 どなたか知恵をお貸しください。 よろしくお願い致します。 例 指定文字:/ 今日は1/2です。明日は1/3です。 1/5まで頑張りましょう。 出力:1/2 1/3 1/5 こういう形にしたいです。 ////////////////////////////////////////// <html> <head> <script language="JavaScript"> function tester() { var str = document.getElementById('input_text').value; arr = str.split(/\r\n|\r|\n/); for (i = 0; i < arr.length; i++) { //この部分がよくわからないです。 } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • Javascript searchで?があるとなぜ

    JavaScriptのsearch関数についてですが、文字列に?があると期待したとおりの結果が得られないのですがなぜでしょうか。 Google Chrome の JavaScriptコンソールでの結果 'abcd?efg'.search('abcd?') 0 'abcd?efg'.search('abcd?e') -1 どちらも0が返ってこないのはどうしてでしょうか。

  • 🟥Javascriptを教えて下さい

    TamperMonkeyで特定のWebページを改造して注意書きなどをしようと考えています。 ❶指定した特定文字列の文字色・背景色を変更するjavascriptを教えてください。 ❷指定した位置などに、特定の文字列を入力するjavascriptを教えてください。 (ミスしないように注意書きするメモ書きのような形) ❸もしWebページ自体を開いた瞬間にメモ書きが表示されるような拡張機能があれば教えてください

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • Adobe系ソフトでJavaScript

    PhotoShopで作業してますが、各デザインでの項数が非常に多いため、JavaScriptで極力自動化を行いたいと思い、JavaScriptで簡略化したいと思っています。 あまり詳しくないので、サンプル等頂けませんか。 具体的には以下の通りです。 1:必要なレイヤーを選択する まず全てのレイヤーを非アクティブにし、レイヤー名でアクティブにするのを指定したいです。 2:テキスト部分を変更 テキストフィールドに入力されている内容を、特定の文字列で置き換えたいです。(引数より指定) 3:現行のまま保存する 1で選択した現状のアクティブになっているレイヤーを名前を付けて、PDFで出力・保存したいです。 ちなみにAdobeは5.5です。 ご教授頂ければと思います。 よろしくお願いいたします。

  • エクセルの質問をさせて下さい!

    今、帳票を作成するのに行き詰ってしまっています・・・。 画像を添付しますが、ABC(D)EF列とあって、 A列は数字/B列はアルファベット(大)/C列はひらがな/D列はなし/E列は 記号(もしくは漢字など)+アルファベット(大)+ひらがな+アルファベット(小)/F列は 空欄となっています。 E列にある文字の中で、B列にある「アルファベット(大)」&C列にある「ひらがな」が 合致しているものは、F列にA列の数字を返す、、、という事をしたいのです。 ※実際はB列の「アルファベット」・C列の「ひらがな」のそれぞれも1文字ではなく前後に  漢字等が入っていたりしますが、合致するキーワードで抽出出来れば。。。 分かりづらくて申し訳ありませんが、検索データが多く困ってしまっています。 (一つずつ照らし合わせていくのも時間がかかってしまって・・・) 宜しくお願いします!!!

  • 正規表現  マッチさせれない C#

    下記のもの全体にマッチさせる表現を考えていたのですが、 どぉしても思いつきません。 まだまだ正規表現についてわかっていないのでご教授いただけないでしょうか。 /// <summary> /// メソッド1 /// </summary> /// <param name="Out">1:入力文字,2:出力文字)</param> /// 文字列     の部分は行が増えたり減ったりするので /// と文字列と改行文字で1つのくくりにして それを任意の回数繰り返しでマッチさせようとしています。 ([/// .*] \r\n)*   (///[.<>/]* \r\n)*  など試しましたがマッチしません。 そもそもこのようなものをマッチさせること自体無理なのかもしれませんが その点も含めご教授お願いいただけますでしょうか。言語はC#です

  • 【Excel】指定先のセルの内容に応じた表示方法

    【Excel】指定先のセルの内容に応じた表示方法 今ここに、2つのエクセルファイルがあります。 αはデータ出力用、βはデータ入力用です。 αのA列にβのB列に入力されたものを指定の形式に変換して出力させることは可能でしょうか。 例えば、βのB列には数字、★などの記号と空白セルがあります。 それをαのA列に、βのB列が数字なら○、★なら★、空白セルなら×と変換をさせた状態で表示させたいのです。 αのデータにβのデータを入れる場合は、「=指定のセルをクリック」で出来るのですが、指定の変換方式で出力できればと思い質問させていただきました。 乱文駄文で失礼致しますが、皆さん宜しくお願い致します。

  • javascriptにて質問です

    javascriptで、各項目に数字の範囲を指定して、入力フォームに半角数字を入力して、その入力した数字が範囲内にある項目のみが表示されて、範囲外の項目は表示されずに下の項目が繰り上がって表示される みたいなことは可能でしょうか 例 項目A (1~100) 項目B (60~100) 項目C (30~70) 項目D (1~40) 項目E (50~50) で、入力フォームに50を入力すると 項目A (1~100) 項目C (30~70) 項目E (50~50) と言う風に50を範囲に含まないのが消えて、詰めて表示されるってのをやりたいんですが