正規表現について質問です。
・先頭、末尾は半角英数字のみ
・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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
部分的に回答します。
- 先頭、末尾と言っているのが1文字であれば、+ や * は付けません。+ は1文字以上、* は0文字以上になってしまいます。先頭の文字集合のところが間違っていると思います。
- 全体が1文字以上については、先頭の判別部分の後ろを ()? でくくればできるかと思います。(先頭1文字の判定条件が共通の場合)
- 記号の連続を許容しないのは、([-_.+]?[a-zA-Z0-9])*[-_.+]? こんな感じでできる気がします。(動作確認はしていません。)
複雑な文字判定は、正規表現よりプログラム言語で記述してしまったほうが簡単な場合が多いです。
投稿2014/12/08 07:25
総合スコア1356
0
google 検索で 連続文字列を正規表現でチェックする方法を見つけました。
- 正規表現で同じ文字の連続を検出したい - 置換前パターン中での後方参照Add Star http://d.hatena.ne.jp/language_and_engineering/20080927/1222508705
([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
総合スコア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
総合スコア4514
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/12/08 07:32