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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

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

Q&A

解決済

2回答

605閲覧

JAVAの正規表現について質問です。

beni999

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

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

0グッド

1クリップ

投稿2018/06/01 13:24

javaでの正規表現の方法について質問です。
対象の文字列が4桁の数字の場合のみ、trueを返却したいです。
しかし、改行コード(\n)を文末に付与した場合、
正規表現が正しく行われず、trueを返却してしまいます。
改行コード(\n)を許容しないようにするには、正規表現をどのように記載すればよいでしょうか。

java

1public static void main(String[] args) { 2 // 検索する文字列を用意 3 String str = "4567\n"; 4 5 // 正規表現のパターンを作成 6 Pattern p = Pattern.compile("^[0-9]{4}$", Pattern.DOTALL); 7 Matcher m = p.matcher(str); 8 9 if (m.find()) { 10 System.out.println("改行なし"); 11 return true; 12 } else { 13 System.out.println("改行あり"); 14 return false; 15 } 16}

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

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

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

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

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

guest

回答2

0

"\A[0-9]{4}\z"

投稿2018/06/01 13:55

otn

総合スコア84533

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

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

KSwordOfHaste

2018/06/01 14:08

こまかい話で恐縮ですがJavaの文字列リテラルなのでバックスラッシュをエスケープしておいた方が混乱がないと思います。
otn

2018/06/01 14:42

ああ、そうですね。うっかりしました。 全然細かくないです。 "\A[0-9]{4}\z" ですね。
beni999

2018/06/02 01:42

回答ありがとうございます。$マークでは、改行コードがはぶかれてしまい、代用として\zがあることを知りませんでした。今後の役に立たせていただきます。
guest

0

ベストアンサー

簡単なのはfindではなくmatchesを使うことでしょうか。その際は^,$は不要です。matchesは与えられた正規表現が文字列全体とマッチするかを判定しますので。

java

1static Pattern pat = Pattern.compile("[0-9]{4}"); 2 3public static void main(String[] args) { 4 // 検索する文字列を用意 5 String str = "4567\n"; 6 7 // 正規表現のパターンを作成 8 Matcher m = pat.matcher(str); 9 10 if (m.matches()) { 11 System.out.println("数字4桁"); 12 } else { 13 System.out.println("マッチせず"); 14 } 15}

本件に関係ないですが...

(1) Patternインスタンスは不変(immutable)です。ゆえに何度もパターンマッチに用いるならstaticフィールドに覚えておくのが効率的だと思います。

(2) 多分例としてコードを作成した際にミスしただけだと思いますがmainはvoidなので値は返せませんね?

投稿2018/06/01 14:01

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2018/06/01 14:10

こんかいのって /[0-9]{4}/s でやってるからであって /[0-9]{4}/m じゃないからというおちじゃないのか(改行がヒットしない)
KSwordOfHaste

2018/06/01 14:14

何度も同じパターンをマッチさせるならmatchesは使えないですが、そもそも全体をマッチさせたいだけじゃないかと思ったのでmatchesが使えて改行とマッチするという意味の$もいらないというふうに考えたのですが・・・あれれーなんか自分が言ってることがおかしく感じてきたw;
KSwordOfHaste

2018/06/01 14:17

ところでボケたこといってるかも知れないですが /[0-9]{4}/s ってどういう意味でしょう?Javaの正規表現ではなく何か別の表現に思えますが・・・
退会済みユーザー

退会済みユーザー

2018/06/01 14:47

記述方式は Perl 等のだけど シングルラインオプションは s でかわりはなかったはず
KSwordOfHaste

2018/06/01 15:14 編集

perlのsingle-lineモードはjavaの場合 Pattern.compile("(?s)^[0-9]{4}$") or Pattern.compile("^[0-9]{4}$", Pattern.DOTALL) にあたるようです。ただこれはドット(.)が改行にマッチするかどうかの制御なので'$'のマッチングには影響しなようです。DOTALLありなしあるいはMULTILINEにしてもfindを用いる限り'$'は\nにマッチしてしまうみたいです。 --- otnさん回答の'\z'を使うかfindでなくmatchesにするかということになるのではないでしょうか。 findがそのまま使えるため、(abc|[0-9]{4}\z)というような表現を用いることを想定すると'\z'が有効と思います。単に全体にマッチさせる前提ならmatchesが簡単といったところではないでしょうか。
beni999

2018/06/02 01:40

丁寧に指摘までいただきありがとうございます。 今回は全体にマッチさせようと思うのでmatchesを使用したいと思います。 使い分けの説明まで教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問