strutsのバリデータでmaskのみで
以下の条件を正規表現を使ってあらわしたいのですが
使用可能文字
半角英数字 @ - _ .
条件
@ _ - . 同一文字の連続使用は不可。
先頭と最期は半角英数字のみ。
全部の文字数は3文字以上30文字以内。
aaa@aaa OK
aaa@_-a OK
aaa@@_a NG
a@@@a NG
@マークの連続使用不可は↓でできたのですが、
^[a-zA-Z0-9]([a-zA-Z0-9]+@?){1,30}[a-zA-Z0-9]$
_ . - の条件を加えるとうまくいきいません。。
よい方法がございましたらご教授ください!!
No.5ベストアンサー
- 回答日時:
struts で使えるかどうか分かりませんが、Javaの正規表現の範囲でなら
以下のような手段を講じることでやってやれなくもないです(先読みを使う)。
最後の二つの条件はやっつけなんで、適当に修正してください。
import java.lang.*;
import java.util.regex.*;
class Regtest {
public static void main(String[] args) {
Pattern p = Pattern.compile(
"(?!.*@@)" + //連続した@を含まない
"(?!.*__)" + //連続した_を含まない
"(?!.*\\.\\.)" + //連続した.を含まない
"(?=^.{3,30}$)" + //3文字以上30文字以下
"^[a-z].*@.*[a-z]$"
);
String s[] = {"foobar@example", "foobar@@exapmle",
"abcdefghijklmnopqrstuvwxyzabcdef@hoge",
"noatmark"};
for (int i=0; i<s.length; i++) {
Matcher m = p.matcher(s[i]);
System.out.print("Test pattern: " + s[i]);
if (m.find()) {
System.out.println(" ==> match");
}
else {
System.out.println(" ==> no match");
}
}
}
}
まじめな話をすると、「××でない正規表現」というのは
とっても書きづらいです(#4でTacosanさんが仰られている通り)。
No.4
- 回答日時:
#2 です. ああ, 確かにおかしいや... で終わらせるとしょうがないので, 自信はないけど補足:
1個の正規表現で書くのは, 多分「理論的には可能だけど物理的には不可能」だと思います. DFA で書けるので理論的には正規表現で書けるはずですが, おそらくとんでもない長さになるんじゃないかなぁ? 単純に DFA で書くと分岐点が 28個 (かつ 4~5分岐) だから....
長さの条件を捨てれば (もっと) 簡単に書けるはず... 自信ないけど....
No.3
- 回答日時:
OK/NGの例として挙げられた例を眺めると @ が必須なような気がしますがちがいますか?
それと
^[a-zA-Z0-9]([a-zA-Z0-9]+@?){1,30}[a-zA-Z0-9]$
ですが、{1,30}という量指定子は直前の ([a-zA-Z0-9]+@?)
にかかりますから、文字列の長さとしては全体で
30文字を超える可能性があるのですが本当にうまくいっているのでしょうか?
たとえば
aabcdefghhijkl@mnopqrstuvwxyz@abcdefghik@mnopqrstuvwxyz@z
とか。
ご解答ありがとうございます。
はい、ほんとは
記述条件@記述条件
という正規表現を作りたかったのですが、
混乱しちゃいそうでしたので記述条件のみの質問にしました。
^[a-zA-Z0-9]([a-zA-Z0-9]+@?){1,30}[a-zA-Z0-9]$
については文字列の長さはうまくいってないですね。。+@?をいれているので30文字を超えてしましますね。
^[a-zA-Z0-9][\w.-]{1,30}[a-zA-Z0-9]$
の条件と@-_.の連続不可の条件を作るしかないのでしょうか。。
No.2
- 回答日時:
#1 同様私も Struts はわからないので Perl で.
全体の文字数に関する制限を無視すれば,
・先頭と最後は英字
・@, -, ., _ の直後に同じ文字がこない
でよくって, Perl で書けば
/^[a-z]+(@[a-z._-]|\.[a-z@_-]|-[a-z@._]|_[a-z@.-]|[a-z]+)*$/
だけなんですが....
文字数については, 無理に正規表現で書く必要はないと思う. ま, わけていいなら
/^[a-z@._-]{3,30}$/ && ! /@@/ && ! /--/ && ! /\.\./ && ! /__/
が最も理解しやすい気もするけど.
ご解答ありがとうございます。
/^[a-z]+(@[a-z._-]|\.[a-z@_-]|-[a-z@._]|_[a-z@.-]|[a-z]+)*$/
ですが、
a@.
a@--d
もtrueになってしまいます。
私もstrutsほとんどわからないので
validator.xmlに
/^[a-z@._-]{3,30}$/ && ! /@@/ && ! /--/ && ! /\.\./ && ! /__/
の様に複数の条件を記述できるのかな。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) Excelで校閲をする方法はあるでしょうか(取扱説明書への掲載禁止用語の確認) 3 2022/06/11 22:51
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- マウス・キーボード macからリモートデスクトップでwindowsに接続した際のキーボード配列 3 2023/07/10 08:40
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「何とかで始まり、何とかで終...
-
正規表現の否定先読みで、複数...
-
「abcで始まらない」を正規表現...
-
【abc】に【完全一致】する正規...
-
日本語の正規化表現
-
VBA EXCEL あるセルの中の一...
-
文字列検索のAND条件を引数にし...
-
文字連続の検出手段
-
intの挙動?
-
ログファイルからキーワードを...
-
正規表現
-
最短一致の使い方
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
C#でcsvファイルの列を入れ替え...
-
エクセルで数値を全角文字(カ...
-
文字コードの%E3%80%とは何です...
-
全角英数字の必要性が理解できない
-
マクロを使ってフォルダー内に...
-
PowerShellでテキストの空白行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「何とかで始まり、何とかで終...
-
VBA EXCEL あるセルの中の一...
-
「abcで始まらない」を正規表現...
-
バッチファイルの正規表現を利...
-
正規表現の否定先読みで、複数...
-
角カッコが含まれてるかどうか...
-
正規表現 英数字を1つ以上含む...
-
C++でofstreamに空白を含む文字...
-
正規表現について
-
XML::Xpathで部分一致検索をす...
-
マクロ・VB得意な人へ。指定し...
-
正規表現で、ある文末に不一致...
-
正規表現にて文字数をチェック...
-
拡張子の正規表現
-
指定した文字列を複数含むとい...
-
正規表現 <>で囲まれたメー...
-
Perl CSVファイルの複数条件で...
-
文字連続の検出手段
-
CASLIIの穴埋め問題について。
-
英数字混じり8文字以上の正規表現
おすすめ情報