No.3ベストアンサー
- 回答日時:
#2のように文字列全体とマッチする正規表現自体が必要なのではなく、
単に与えられた文字列が許されたものかNGかを知りたいだけであれば、
文字列が部分的にマッチするか否かで判定する方がずっと効率がいい。
この場合は#1の方が言っているように許されない-の連続があるかどうかが判断材料になる。
String[] strings = {"abCd-012", "ABC--012", "A-B-C-D-", "a_12#3", "-", "aBc9", "-A-B-C", "A-B-C", "--A"};
String regex = "[^-\\p{Alnum}]|--+";
Matcher matcher = Pattern.compile(regex).matcher("");
for (String s : strings) System.out.printf("%s %s%n", s, matcher.reset(s).find() ? "×" : "○");
正規表現 [^-\p{Alnum}]|--+ は、-または英数字以外の文字1個か([^-\p{Alnum}])、2個以上連続する-に(--+)マッチする。
判定したい文字列を与えたMatcherのfindメソッドでこのパターンにマッチする部分があるかないかを判断すればいい。
もちろん見つかればNGである。
No.2
- 回答日時:
除外したい-の連続をどう表現しようかと考えると難しくなる。
単独の-でそれ以外の文字の塊が接続されていると考えるといい。
許される文字列の構造を考えてみるために、
Aを連続することが許された文字、
bを連続してはならない文字とする。
まず、1文字以上のAの連続(A+)や、単独のb(b)は許される。
そして、2つの A+ が1個の b で接続されているもの(A+bA+)も許される。
この場合、その文字列の先頭と末尾にbがあっても(無くても)構わない(b?)だろう。
これらのことから以下のようなものが許される文字列と考えられる。
b
b?A+b?
b?A+bA+b?
b?A+bA+bA+b?
b?A+bA+bA+bA+b?
...
最初の単独の b を除けば次のようにまとめられる。
b?A+(bA+)*b?
1個の A+ の後に bA+ が0個以上連続するパターンが一般形と考えられる。
単独の b のパターンを合わせると求めるべき正規表現は、
b|b?A+(bA+)*b?
質問では、
A = \p{Alnum}
b = -
なので、求める正規表現は、
-|-?\p{Alnum}+(-\p{Alnum}+)*-?
これしかないわけでなく考え方の問題なので別の表現もあると思うし、
一つの正規表現で一気に表現する必要が無ければもっと自由度が上がる。
この正規表現をプログラム中にリテラルとして書く場合は\をエスケープする必要がある。
String[] strings = {"abCd-012", "ABC--012", "A-B-C-D-", "a_12#3", "-", "aBc9", "-A-B-C", "A-B-C", "--A"};
String regex = "-|-?\\p{Alnum}+(-\\p{Alnum}+)*-?";
for (String s : strings) System.out.printf("%s %s%n", s, s.matches(regex) ? "○" : "×");
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 11:41
- Excel(エクセル) Excel 文字列を結合するときに重複をなくしたい 関数・VBA 2 2022/12/12 10:40
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/08 09:05
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 08:37
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAの支部?地域の農協のカード...
-
配列にnullを代入すると、null...
-
プログラミングの問題です。大...
-
list の空は [] ってあわらすのに
-
下記問題の答えが"D"になる意味...
-
eclipse実行ができない
-
正規表現について質問です。 カ...
-
JSFタグのfタグとは
-
jdk17.06のインストーラーが起...
-
Eclipse 動的プロジェクトで404...
-
キー入力について
-
EclipseとVisual StudioをPC1台...
-
プログラミング教えてください。
-
CSV出力を画面から選択したデー...
-
あんまりお料理しないのに台所...
-
質問です。 配列が100以上の場...
-
次のhtml・cssでspan内の文字を...
-
Jupyter notebookですわかりま...
-
改行含むテキストの表示の仕方
-
JaneStyleのスレッドが見れなく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングの問題です。大...
-
マイクラでPythonのプログラミ...
-
配列にnullを代入すると、null...
-
jdk17.06のインストーラーが起...
-
Eclipse 動的プロジェクトで404...
-
list の空は [] ってあわらすのに
-
下記問題の答えが"D"になる意味...
-
JaneStyleのスレッドが見れなく...
-
正規表現について質問です。 カ...
-
eclipseで作ったプログラムを他...
-
改行含むテキストの表示の仕方
-
リレーションエンティティクラ...
-
質問です。 配列が100以上の場...
-
次のhtml・cssでspan内の文字を...
-
キー入力について
-
自作Androidアプリのデータ引き...
-
問題作成のWebアプリの作り方を...
-
eclipse実行ができない
-
変数名とDBカラム名の関係性に...
-
デバッグツールの具体例を教え...
おすすめ情報