正規表現で「任意の文字」を一致させる方法は?


305

次のものを一致させる必要があります。

AAA123
ABCDEFGH123
XXXX123

僕にできる: ".*123"


2
このリンクは、機能しているように見えるアプローチを示しています-> [^] +これは、「どの文字にも一致しない」、つまり「任意の文字に一致する」と読み直すことができる二重否定を意味します。ソース- loune.net/2011/02/...
HockeyJ

回答:


645

はい、できます。うまくいくはずです。

  • . =任意の文字
  • \. =実際のドット文字
  • .?= .{0,1}=任意の文字に0回または1回一致
  • .*= .{0,}=任意の文字に0回以上一致
  • .+= .{1,}=任意の文字に1回以上一致します

22
ドットは常に文字であるとは限りません。単一行モードの場合の例外。\ p {all}は
火星

この文字リストにバックスラッシュをどのように含めることができますか?
検索結果Web結果Pi

1
@pippilongstockingバックスラッシュは `\\`です
Poutrathor

58

はい、動作し.ますが、式のコンパイル時にDOTALLフラグを渡さない限り、は改行に一致しません。

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
これは非常に役立つ情報です。.改行にマッチすると思いました。あなたの答えを読んでよかった、それを使う必要がある!
Ben Kane

Eclipseで複数行の正規表現検索を行う場合や、正規表現検索を提供するJavaアプリケーションのユーザーとして、Pattern.DOTALLを渡すことができないコンテキストでJava正規表現の改行を一致させる必要がある場合もあります。regular-expression.infoのガイドに基づいて、{.,\n,\r,\u2028,\u2029,\u0085}すべての文字を完全に一致させるために使用する必要がある場合があります(Unicode文字は.、Javaでは一致しない追加された行末文字です)が、{.,\n,\r}ほとんどのテキストファイルで機能します。
セオドアマードック2015年

8
@TheodoreMurdock [\s\S]は、DOTALLを使用できない場合に任意の文字を照合する一般的な方法です。
mpen 2016年

JDK-6337993の(?:.|\\v)*ため、気になった場合は使用しないでください。
Olivier Cailloux 2018

22

パターン.を使用して、任意の文字を1回.*照合し、任意の文字を0回以上 .+照合し、任意の文字を1回以上照合します。


11

洗練された正規表現のテストおよび開発ツールはたくさんありますが、Javaで単純なテストハーネスが必要な場合は、以下を試してみてください。

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

これで、新しいテストケースを簡単に追加して、新しいパターンを試すことができます。正規表現の探索を楽しんでください。

こちらもご覧ください


1
regular-expressions.infoリンクだけに賛成投票してください。正規表現の学習と参照のための素晴らしいサイト。
フライハイト

9

いいえ、*ゼロ個以上の文字に一致します。+代わりに、1つ以上に一致するを使用する必要があります。

この表現はあなたにとってよりうまくいくかもしれません: [A-Z]+123


1
ここに賛成票を投じます。OPは指定しませんでしたが、パターンが### 123、123123、%$#123など、OPが必要としない可能性のある任意の文字に一致することを追加するのは正しいようです。@Huusomが上記で使用する文字クラスは、すべてのOPが意図していた可能性がある大文字のアルファベット文字のみを使用します。
techdude 2015年

9

これをエンコードするために私が見た最も一般的な方法は、メンバーがすべての可能な文字のセットのパーティションを形成する文字クラスを使用することです。

通常、人が書くものと[\s\S]いえ(空白や非空白)、 、[\w\W][\d\D]などすべての作業がでしょう。


2
参考までに、regular-expressions.info / dot.htmlから: "JavaScriptおよびVBScriptには、ドットマッチの改行文字を作成するオプションがありません。これらの言語では、[\ s \ S]などの文字クラスを使用できます。は、任意の文字に一致します。この文字は、空白文字(改行文字を含む)または空白文字ではない文字に一致します。すべての文字は空白または非空白文字であるため、この文字クラスは任意の文字に一致します」
ディーンまたは

7

.*そして.+新しい行を除く任意の文字のためのものです。

ダブルエスケープ

念のため、新しい行を含めたい場合は、次の式も、JavaやC ++などのダブルエスケープが必要な言語で機能する可能性があります。

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

ゼロ回以上、または

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

1回以上。

シングルエスケープ:

C#、PHP、Ruby、PERL、Python、JavaScriptなどの一部の言語では、ダブルエスケープは必要ありません。

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

テスト

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}

出力

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

式を探索したい場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。


RegEx回路

jex.imは正規表現を視覚化します。

ここに画像の説明を入力してください


1
それはすでにここで答えられていませんか?stackoverflow.com/a/55149095/5424988
4

(\W|\w)*ダブルエスケープの代わりに好きです
Sudip Bhattarai

1
本当に役立つ説明
Nagibaba

5

問題例の具体的な解決策:-

試し[A-Z]*123$一致します123AAA123ASDFRRF123123使用前に少なくともキャラクターが必要な場合[A-Z]+123$

質問に対する一般的な解決策(正規表現の「任意の文字」に一致させる方法):

  1. 空白を含む何かを探しているなら、試すことができます [\w|\W]{min_char_to_match,}
  2. 空白以外のものと一致させようとしているなら、試すことができます[\S]{min_char_to_match,}

2

[^]改行を含む任意の文字と一致する必要があります。[^CHARSは、CHARSの]文字を除くすべての文字に一致しますCHARSが空の場合、すべての文字と一致します。

JavaScriptの例:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

何を試したかを知らせるためにコードを追加していただけませんか?
Jennis Vaishnav


-4

私はこれを動作させます常にドットは任意の文字を意味しません。単一行モードの場合の例外。\p{all}する必要があります

String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
    System.out.println("true");
} else {
    System.out.println("false");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.