質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

4913閲覧

正規表現 /\P{C}/uをmatchメソッド、pettern属性で使いたい

k499778

総合スコア599

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2016/04/20 03:18

編集2016/04/20 03:28

前回の投稿の続きになります。
https://teratail.com/questions/32811

表題にある通りですが、

正規表現 /\P{C}/uをjsのmatchメソッド、またはhtmlのpettern属性で使うにはどのような書き方をすればいいでしょうか?

現在エラーチェックをしようとしているのですが、以下のような書き方をするとシンタックスエラー、もちろんクオートで囲むと文字列として認識されてしまいうまくいきません。

var reg = /\P{C}/u;
if(val = match.(reg)){
alert(”制御文字は入力できません。”);
return false;
}

pettern属性に関してもpettern属性の使い方はわかるのですが、そこに設定する上記の正規表現の書き方がわからないでいます。

もしわかる方がいらっしゃいましたらお答え頂けると助かります。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

外部のライブラリ
のようなものを使わないと javascriptで \P 使えません

制御文字は入力できませんを出したいなら
/[\x00-\x1f\x7f-\x9f]/
とかを検討してみてください。

投稿2016/04/20 04:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/04/20 11:33

回答ありがとうございます。 そうなんですね。jsでは \P を使えないと知れただけでもよかったです。 結果から言うと、phpを使って処理しました。 ajaxを使ってサーバー側(php)に入力値を飛ばし、preg_matchメソッドで上記の正規表現を使って判定し、 再度js側で返ってきた判定を使ってアラート処理を行いました。 アドバイスしていただきありがとうございました。
guest

0

コードの要件を推測する限り、正しいJavaScriptコードとHTMLは以下になると思います。

JavaScript

1/* 変数valに判定対象の文字列が代入されているものとします */ 2 3// Cプロパティを持つUnicode文字1字にマッチするパターン 4var reg = /\p{C}/; 5 6// Cプロパティを持つUnicode文字が1文字でも含まれていたら、 7// alertを出す 8if (reg.test(val)) { 9 alert("制御文字は入力できません。"); 10 return false; 11}

HTML

1<!-- 値が1字以上で、かつ、Cプロパティを持たないUnicode文字のみで構成されているか判定 --> 2<input type=text pattern="^\P{C}+$">

また、それぞれのパターンの意味はPHPのPCRE正規表現を参考に、以下と仮定します。

  • \p{C}:Cプロパティを持つUnicode文字(制御文字など)にマッチするパターン
  • \P{C}:Cプロパティを持たないUnicode文字(制御文字など以外)にマッチするパターン

以上を前提とし、解説していくものとします。


まず、JavaScriptの正規表現には、\p{C}\P{C}などの記述でUnicode文字の範囲を示すことができる「Unicode文字プロパティ」が存在しません。
また、maisumakunさんの解答のとおり、HTMLのpattern属性の正規表現はJavaScriptのものであるため、同じくpattern属性でも存在しません。

このため、そのUnicode文字プロパティが示す範囲の文字にマッチするパターンを直接書かなくてはなりません。
まずは、どちらかと言えば簡単な\p{C}のパターンから解答します。

\p{C}はCプロパティを持つ文字を示すパターンです。このため、Cプロパティの文字にマッチするパターンを自力で書くことになります。
ですが、Unicode文字プロパティの文字集合のデータは、mathiasbynens/unicode-dataで公開されていますので、ここの正規表現をそのまま流用しましょう。
現在(2016年4月20日)はUnicode 8.0.0が最新版であるため、ここではunicode-data/8.0.0/categoriesのデータを利用します。

Cプロパティの正規表現は、unicode-data/8.0.0/categories/C-regex.jsに書かれています。\p{C}の場合は、これをそのまま利用すれば良いわけです。
この正規表現を利用した、正しく動作するJavaScriptコードは以下になります。
(字数制限のため、外部ページとなります)

http://pastebin.com/vs2VrJjB


次に、\P{C}のパターンを解答します。

\P{C}はCプロパティを持たない文字を示すパターンです。
このため、先ほどのパターンの否定にマッチすればいい…のですが、一筋縄ではいきません。

mathiasbynens/unicode-dataでは\P{C}に該当する正規表現は公開されていません。
このため、何かしらの方法で生成しなくてはなりません。
そこで、以下の質問で試みられているのと同じように、mathiasbynens/regenerateを使用して正規表現パターンを生成します。

unicode-data/8.0.0/categories/C-code-points.jsには、Cプロパティの文字一覧が数値によるコードポイントの配列データとして記述されています。
これを、以下のコードで動作させることで、\P{C}の正規表現パターンを生成できます。

JavaScript

1var C_code_points = [ /* C-code-points.jsの配列データ */ ]; 2var rg = regenerate() 3 // 全てのUnicode文字を追加 4 .addRange(0, 0x10FFFF); 5 6C_code_points 7 .forEach(function(code_point) { 8 // Cプロパティを持つ文字を順に削除していく 9 rg = rg.remove(code_point); 10 }); 11 12// \P{C} と同じ意味のパターンを生成 13console.log(rg.toString());

\P{C}の正規表現パターンは、以下になります。
(字数制限のため、外部ページとなります)

http://pastebin.com/ynhfxiwB

このパターンを利用した、正しく動作するHTMLは以下になります。
(字数制限のため、外部ページとなります)

http://pastebin.com/1PsMXmih

投稿2016/04/20 11:40

編集2016/04/20 11:42
sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/04/20 12:01

わざわざここまで詳しく解説していただき、また実際のコードも作っていただき大変感謝しています。 保存版にして何度も読み直します。 本当にありがとうございました!
guest

0

JavaScriptの正規表現には、Unicodeプロパティを扱う\p\Pはありません。

JavaScriptで同等なことを実現するには、Unicodeプロパティを調べて、自分で正規表現に書き下ろすほかありません。

また、HTML5のpattern属性も、JavaScriptの正規表現を使うとのことですので、\p\Pは使えません。

投稿2016/04/20 04:09

編集2016/04/20 04:11
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2016/04/20 11:34

回答ありがとうございます。 jsでもhtmlでも上記の正規表現が使えないと早めに知れてよかったです。 phpに値を飛ばして、そこでバリデーションチェックすることで対応しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問