ここから本文です

正規表現でname.matches("[A-Z][.*]{7}");と書きました。

ble********さん

2016/11/1212:55:46

正規表現でname.matches("[A-Z][.*]{7}");と書きました。

・1文字目は大文字のアルファベット
・2文字目以降はなんでもよい
・必ず8文字である
という条件のはずなのですがnameに何を入力してもfalseが返ってきます。

そこで2つ質問があります。
1)試しに[.*]の角カッコを外して.*とするとtrueが返ってきますが、その場合は文字数の判定がされず1文字目が大文字であればtrueが返ってきてしまいます。[A-Z][.*]{7}が意図したとおりに動かない原因と上の条件で動かす方法を教えていただけないでしょうか?
2)パターンの[.*]を[\w]と書きたい場合Windows7の日本語Eclipse環境なので¥の半角が表示されません。日本語キーボードの¥マークの部分にある\ですと「エスケープシーケンスが無効です」とエラーになります。用意されている文字クラスの¥wを利用するには何を入力すればいいのでしょうか?

public class Main {
public static void main(String[] args) {
String s = "Test1111";

if ( isValidPlayerName(s) ) {

System.out.print("正しい入力です");
} else {
System.out.println("正しく入力してください");
}

}

static boolean isValidPlayerName(String name) {
return name.matches("[A-Z][.*]{7}");
}
}

閲覧数:
111
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

foo********さん

2016/11/1215:11:51

1)
既に回答されてますが、
[A-Z].{7}

ブラケット [ ] 囲みの部分は、正規表現で 文字クラス と
いわれるもの。
ブラケット内に書かれた いずれかの1文字 を意味する
もので、そこでは 任意の文字 とか 0個以上任意の長さ とか、
ありえない。 メタ文字 . や * も、その通りの文字として扱われる。

任意の1文字
を意味する正規表現は
.
です。

2)
よくわからないですけど、2つの話がいりまじってるように
読めました。

1. 円記号 と バックスラッシュ
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%...

日本製PCとかだと 半角円記号 と表示されることが多いですが、
外観が バックスラッシュ でも 円記号 でも、同じです。
あなた、「正規表現のエスケープ文字は半角円記号文字でなければならない」
と思い込んでませんか? (^_^;)

あなたのeclipseでは、キーボードの円記号文字キーを押すと、
バックスラッシュが表示されてるのでは?
表示は フォント で決まるので、あなたのeclipseで表示に使われてる
フォント次第。

2. 「エスケープシーケンスが無効です」とエラーになります
\w
ではなく
\\w
と書いたら、うまくいくのではないかと想像。

二重引用符でくくった Java言語のリテラル文字列 内に
正規表現書いてるでしょ?
バックスラッシュ は、リテラル文字列 においても特別な
意味を持つエスケープ文字です。
\n が 改行文字 である、など。

match に 文字列 として正規表現を渡さねばなりませんから、
match から見て \w という2文字になるようにするには
\\w
とする必要がある。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2016/11/12 18:08:03

1も2も上手くいきました!他のお二人の回答も参考になりましたが2も答えていただいたfoobar7979さんをベストアンサーに選びました。みなさんありがとうございました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

rat********さん

2016/11/1213:20:17

1)
name.matches("[A-Z].{7}");
にすればいいのではないでしょうか

ara********さん

2016/11/1213:15:27

・ツッコミ1
[] の中ではメタ文字としての機能を発揮しませんので、[.*]は「アスタリスクかピリオドのどちらか」です。

・ツッコミ2
角かっこを外して .*{7} とした場合

. = どんな文字でも
* = 0文字以上

だから、正規表現 [A-Z].*{7} はA123 でも Aあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん でもマッチします。っていうか、. の次に * があるんですから {7} の意味がありません。

・ツッコミ3
^$ がなければ部分にマッチしてしまいますから、正規表現 [A-Z].{7} でも 0ABC123456789 という文字列の(0と6789を無視して) ABC12345 にマッチするので true になるでしょう。
(^[A-Z].{7}$ なら false)

2)はEclipse使ってないのでわかりません。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる