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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

3回答

3201閲覧

[正規表現]特定記号(数種)の連続利用不許可

KoukoMatsumoto

総合スコア41

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2014/12/08 07:06

正規表現について質問です。
・先頭、末尾は半角英数字のみ
・2文字目〜末尾の1文字前 は半角英数字と記号「-」「_」が利用可能
・記号を連続利用してはならない
・文字数は1文字以上で設定可能。 「a」「ab」なども許容される。
こういった条件の場合の正規表現をお教え願えませんでしょうか。

以下のようなものを試しましたが、全部引っかかるか、全部アウトかになり、うまくいきません。
/\A[a-zA-Z0-9]+[a-zA-Z0-9-_.+]+[a-zA-Z0-9]\z/
/\A[a-zA-Z0-9][a-zA-Z0-9-_.+][a-zA-Z0-9]\z/

また、連続部分は文字数が3文字以上のみの場合のみの判定となりますが、一つの正規表現でこの条件も盛り込むことはできるのでしょうか。

お手数ですが、正規表現に詳しい方、お知恵を拝借願えると助かります。

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

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

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

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

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

guest

回答3

0

ベストアンサー

部分的に回答します。

  • 先頭、末尾と言っているのが1文字であれば、+ や * は付けません。+ は1文字以上、* は0文字以上になってしまいます。先頭の文字集合のところが間違っていると思います。
  • 全体が1文字以上については、先頭の判別部分の後ろを ()? でくくればできるかと思います。(先頭1文字の判定条件が共通の場合)
  • 記号の連続を許容しないのは、([-_.+]?[a-zA-Z0-9])*[-_.+]? こんな感じでできる気がします。(動作確認はしていません。)

複雑な文字判定は、正規表現よりプログラム言語で記述してしまったほうが簡単な場合が多いです。

投稿2014/12/08 07:25

TaMaMhyu

総合スコア1356

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

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

KoukoMatsumoto

2014/12/08 07:32

TaMaMhyuさん、ご回答ありがとうございます。頂いた内容で一旦、検証してみたいと思います。 正規表現に不慣れなため、お知恵頂き感謝いたします。 こちらでどうしても厳しい場合は、プログラムで定義しようと思います。
guest

0

google 検索で 連続文字列を正規表現でチェックする方法を見つけました。

([a-z])\1

これを利用して、次のようなチェックメソッド定義と簡易なテストをしてみました。

lang

1# coding: utf-8 2 3TESTS = [ 4 ["a", true], 5 ["1", true], 6 ["_", false], 7 ["-", false], 8 9 ["aa", false], 10 ["11", false], 11 ["12", true], 12 ["ab", true], 13 ["a1", true], 14 ["a_", false], 15 16 ["abc_abc", true], 17 ["abc_xx_abc", false], 18 ["abc_あ_abc", false], 19 ["abc_ああ_abc", false], 20].freeze 21 22def check_pattern(str) 23 rexp = Regexp.new('\A[a-zA-Z0-9]+[\w|\-]*[a-zA-Z0-9]+\z') # 2 文字以上の場合 24 rexp1 = Regexp.new('\A[a-zA-Z0-9]\z') # 1 文字の場合 25 rexp_dup = Regexp.new('(.)\1') # 同じ文字の連続があるかを調べる。 26 match = nil != rexp.match(str) 27 match1 = nil != rexp1.match(str) 28 match_dup = nil == rexp_dup.match(str) 29 (match || match1) && match_dup 30end 31 32TESTS.each do |test| 33 ans = check_pattern(test[0]) 34 puts "#{ans}: #{test[0]}" 35 puts " --- Error:" if ans != test[1] 36end

実行結果は次のようになります。

lang

1true: a 2true: 1 3false: _ 4false: - 5false: aa 6false: 11 7true: 12 8true: ab 9true: a1 10false: a_ 11true: abc_abc 12false: abc_xx_abc 13false: abc_あ_abc 14false: abc_ああ_abc

投稿2014/12/08 13:48

katoy

総合スコア22324

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

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

0

問題を誤読しているかもしれませんが・・・

・先頭、末尾は半角英数字のみ
・2文字目〜末尾の1文字前 は半角英数字と記号「-」「_」が利用可能
・記号を連続利用してはならない
・文字数は1文字以上で設定可能。 「a」「ab」なども許容される。

次のように読み替えると、

  • 先頭は 半角英数字 が 1 個以上で始まる
  • 以降は (記号が 1 個と 半角英数字 が 1 個以上) の 0 回以上の繰り返し

次のようになります。

lang

1# coding: utf-8 2 3TESTS = [ 4 ["a", true], 5 ["1", true], 6 ["_", false], 7 ["-", false], 8 9 ["aa", true], 10 ["ab", true], 11 ["11", true], 12 ["12", true], 13 ["a1", true], 14 ["a-", false], 15 ["_a", false], 16 17 ["abc_abc", true], 18 ["abc_123", true], 19 ["abc__123", false], 20 ["abc--123", false], 21 ["abc_-123", false], 22 ["abc_xx-abc", true], 23 ["abc_xx-_abc", false], 24 ["abc-_xx-abc", false], 25 26 ["あ", false], 27 ["ああ", false], 28 ["abc_あ_abc", false], 29].freeze 30 31 32def check_pattern(str) 33 /\A[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*\z/ =~ str 34end 35 36TESTS.each do |test| 37 str, exp = test 38 ans = check_pattern(str) 39 chk = (ans != nil) == exp ? "ok" : "NG" 40 puts "#{chk}: #{str} ... #{ans.inspect}" 41end

投稿2014/12/08 16:18

ngyuki

総合スコア4514

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問