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

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

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

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

Q&A

解決済

5回答

9807閲覧

正規表現で許可したい文字と、許可したくない文字をチェックしたい。

pgm_bakabon

総合スコア61

正規表現

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

0グッド

0クリップ

投稿2018/04/09 10:54

編集2018/04/13 02:00

いつもお世話になっております。

正規表現が大変苦手で困っております。

正規表現の使用用途は、WEBサービスの入力チェック用で、
PHP(symfony)のバリデーションで使用します。

作成したい正規表現をの条件を以下に記載します。
条件1:半角英数字の入力は許可したい
条件2:記号を許可したいが、|の記号のみは許可したくない

この条件で一つの正規表現で制御可能なのでしょうか?
また、参考程度で構いませんので、どのように記述するかご教授いただけると助かります。

今時点、下記コードで、
半角英数字の入力と、|の記号のみ許可できている状態にはなってます。
追記4/10 10:25)これの**|\s**の部分を|は許可しないと変更できるのでは?と考えてます。

/^[a-zA-Z0-9\|\s]$/

よろしくお願いいたします。

追記4/13 11:00)
/^[!-{}~]*$/の正規表現を用いる形で進めさせていただきました。
たくさんのご回答をいただきありがとうございました。
正規表現はもうやりたくないと思ってしまってますが、どの言語にも必要なものではあるので基礎は勉強しておこうかと思います。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/11 07:54

ぶっちゃけ「正規表現の使用用途は、WEBサービスの入力チェック用で、 PHP(symfony)のバリデーションで使用します。」こんなんは本来、フレームワークのバリデーションライブラリが担保すべき物なんですが、PHPの糞フレームワークのバリデーション機構にまともなものは皆無ですね。
pgm_bakabon

2018/04/13 01:44

PHP(フレームワーク)のバリデーションってどれも穴がありますよね。。。
guest

回答5

0

AND条件

条件1:半角英数字の入力は許可したい
条件2:記号を許可したいが、|の記号のみは許可したくない

上記全てを一つの正規表現で書くことは先読みと | を併用すれば可能ですが、条件2のAND条件を一つの正規表現で書くことはお勧めしません。
ワイルドカードを使わなければならず、正規表現は最長一致な事から、パフォーマンスが低下してしまうからです。
技術的見地から追求するのなら、止めませんが。

半角英数でも記号でもない文字

「半角英数でも記号でもない文字」に対して条件がありませんが、これは許可対象でしょうか。

JavaScript

1if (/\|/.test(string)) { 2 return; // "|" は不許可 3} 4 5// それ以外は全て許可する

/^[a-zA-Z0-9|\s]$/

今時点、下記コードで、
半角英数字の入力と、|の記号のみ許可できている状態にはなってます。

/^[a-zA-Z0-9\|\s]$/

1文字のみ許可される仕様ですが、これはいいのでしょうか。
条件にない空白文字1文字も許可対象ですが、良いのでしょうか。

AND条件で書いてみる

AND条件を一つの正規表現で実装する場合の何が問題なのか、をGitHubにまとめておきました。
JavaScriptコードで書いていますが、基本的な正規表現パターンはPHPと同じなので、PHPマニュアルを見ながら比較して読んでみて下さい。

Re: pgm_bakabon さん

投稿2018/04/09 14:32

編集2018/04/10 10:48
think49

総合スコア18162

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

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

think49

2018/04/10 10:49

正規表現でAND条件はたまに上がる質問なので、GitHubにまとめておきました(親記事参照)。
pgm_bakabon

2018/04/11 02:13

ご回答ありがとうございます! 取り急ぎ、初回にいただいた回答に対してのお返事させていただきます。 \sって空白だったのですね、、、ご指摘いただいて知りました。 \|\で|を囲ってsがstringの認識をしてました。 空白は許可しない内容です。 ご指摘ありがとうございます。
guest

0

許可したい文字を列挙すれば良いです。

投稿2018/04/09 11:28

otn

総合スコア84505

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

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

pgm_bakabon

2018/04/09 11:52

回答ありがとうございます! 許可したい文字を列挙するですね。 素直にその方が良いですかね? ¥%$!?,.<>とか列挙ではなく、|以外という正規表現をずっと探してました。
otn

2018/04/09 12:04

「 | 以外の全ての文字」なら、/^[^|]*$/ です。 「半角英数字と、半角記号、ただし | を除く」なら、/^[!-{}~]*$/ ですね。
pgm_bakabon

2018/04/11 02:17

ご返信ありがとうございます! 実装を続けていて、/^[!-{}~]*$/で行けそうです!
guest

0

制御可能です。
作った正規表現をこことかで検証してみるとイイです。

追記
列挙なら上記サイトで十分ですが、and or 的な表現で記述しようとした場合は、このサイトでは検証できません。
先読み・後読みが必要な検証がしたい場合、以下を使用すると良いです。
regex101.com

投稿2018/04/09 10:56

編集2018/04/09 13:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pgm_bakabon

2018/04/09 11:49

回答ありがとうございます! 可能ということで、教えていただいたサイト活用して検証してみます。
退会済みユーザー

退会済みユーザー

2018/04/09 13:15

記述してある要件は要件として機能してません。 見直してみると解決方法が見えてくると思います。 見直した要件によっては、紹介したサイトでは対応できないので、追記しました。
pgm_bakabon

2018/04/10 01:44

追記ありがとうございます。 要件今一度整理します。 新しいサイトの紹介ありがとうございます。 紹介していただいたサイト2つとも初めて見ました。
guest

0

ベストアンサー

範囲がわからないということですか?
Unicode一覧表 の基本ラテン文字を見てください。
[!-{}~] ということでしょうか?

投稿2018/04/09 11:45

Zuishin

総合スコア28660

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

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

pgm_bakabon

2018/04/09 11:55

回答ありがとうございます。 質問させてしまうQで申し訳ありません。 範囲?というものを活用できるのかがそもそもわかっておりません。。。 Qにもある通り、/^[a-zA-Z0-9\|\s]$/ の状態なのですが、 \|\ の部分で、何かすれば、|の記号は除外できる(= |以外は使用可能)という状態にできるのでは? というところで止まっております。
Zuishin

2018/04/09 11:59

確認なのですが、正規表現読めますか? 読めないならどのように説明していいかわかりません。 [a-z] というのは a から z までの範囲を表します。 同様に [A-Z] は A から Z まで、[0-9] は 0 から 9 まで、\s は空白記号です。 [a-zA-Z0-9\s] でそれらの範囲を合わせたものです。 つまり一覧表を見て好きな範囲を選べばいいわけです。 この回答の場合は ! から { までの範囲と } と ~ を選んでいます。 除外しなくても含む範囲をすべて入れればいいわけです。
pgm_bakabon

2018/04/11 02:23

ご返信ありがとうございます。 正規表現は読めないですね。。。 こちらにご返信いただけて少し読めるようになりました。 >つまり一覧表を見て好きな範囲を選べばいいわけです。 どうやって範囲を選んでるんだろうとずっと疑問でしたので、回答いただけて理解が少し深まりました。 範囲はUnicode一覧表が元になるんですね。 >この回答の場合は ! から { までの範囲と } と ~ を選んでいます。 あー、「! から { までの範囲」は理解できたのですが、「} と ~」は}以降という意味かと思ってました。。。「} と ~」を指定してる意味だったのですね。。。 今、/^[!-{}~]*$/の正規表現で実装を進めております。
guest

0

こんにちは

参考程度に

サルでもわかる正規表現

投稿2018/04/11 04:27

haruniku

総合スコア527

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

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

pgm_bakabon

2018/04/11 05:37

ありがとうございます。 サルでもシリーズには頼りたくなかったですが、頼った方が良さそうですねorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問