7

私は正規表現のJavaの概念に不慣れです。

以下の文字列に使用する正しい正規表現を教えてください -

String exp = "ABCD_123_abc".

上記の文字列に使用している正規表現は次のとおりです。

regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"

しかし、以下のコードの出力は"**No Match Found**"

Public static void main()
{
   String exp = "ABCD_123_abc";
   String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";
   Pattern pattern = Pattern.compile(exp);
   Matcher matcher = pattern.matcher(regExp);
   if(matcher.matches())
   {
     System.out.println("Match found");
   }
   else
   {
     System.out.println(" NO Match found");
   }


}
4

8 に答える 8

12

問題は、正規表現パターンと式の使用を誤って入れ替えてチェックしたことです。

String exp = "ABCD_123_abc";
String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";

使用すべきです

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);

Pattern.compile (String regex)関数は、正規表現を受け入れます。

編集

申し訳ありませんが、私の最初の解決策は決して決して行われてはならないものでした。変数の名前は、それらの値の意味と矛盾していました...つまり、痛みと涙、そして叫びながら怒っている同僚に襲われることを意味します。で。そして、この犯罪に対する有効な防御はありません...

EDIT2 Matcher.group (int)関数を使用 して、一致した個々のグループを取得できます。

String matchedStringpart matcher.group(2);

注意:私2は引数として使用しました:

  • 0入力シーケンスが一致したことを意味します
  • 1最初のグループを意味します(ABCこの場合)
  • ... 等々

パーツのみが必要な場合は123、わかりやすくするために正規表現を書き直します。

regExp = "[a-zA-Z]+_([0-9]+)_[a-z]+";

ただし、その場合は、group()で呼び出す必要があります1。これは、最初の(そして唯一の)一致したグループが最初のグループであるためです。

String matchedStringpart matcher.group(1);
于 2013-03-19T09:46:42.063 に答える
8

正規表現をコンパイルしていません。あなたが必要です

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);

つまり、上記のコードは正規表現と入力文字列を混同しています。ただし、実際の正規表現は正しいです。

于 2013-03-19T09:47:54.000 に答える
5

あなたの正規表現は完全に素晴らしいです。

exp問題は、コードを交換したという事実に起因regExpします。関数compileは引数として正規表現をmatcher取りますが、関数は一致する式を取ります。

于 2013-03-19T09:47:44.693 に答える
4

あなたの(編集された)正規表現は問題ありません。

を抽出したい場合は123、 を使用できますmatcher.group(2)。そのメソッドは、またはの後にのみ呼び出すことができます。n 番目の を返します。キャプチャ グループは、括弧で囲まれた正規表現の一部です。一致した文字列を返します。 matchesfindmatcher.group(n)capture groupmatcher.group(0)

if(matcher.matches()) {
  System.out.println(matcher.group(0));
  System.out.println(matcher.group(1));
  System.out.println(matcher.group(2));
  System.out.println(matcher.group(3));
}

版画

 ABCD_123_abc
 ABCD
 123
 abc
于 2013-03-19T10:04:43.287 に答える
2

if(exp.matches(regExp))

これだけで十分です。他に必要がない限り、パターン/マッチャーは必要ありません。

于 2013-03-19T09:47:25.437 に答える
1

この場合、123 を取得する場合は、次のコードを使用します。

 System.out.println(matcher.group(2));

これは出力を次のように出力します:123

あなたの正規表現は完全に問題ありません。

于 2013-03-19T10:07:04.433 に答える
1

このパターンは機能します。任意の数の大文字または小文字、アンダースコア、任意の桁数、アンダースコア、任意の数の大文字または小文字に一致します。より具体的にしたい場合は、特定の文字数に一致させるの{n}ではなく、使用できます。+

public static void main(String[] args) {
    final String myString = "ABCD_123_abc";
    final Pattern p = Pattern.compile("^[A-Za-z]++_(\\d++)_[A-Za-z]++$");
    final Matcher matcher = p.matcher(myString);
    if (matcher.matches()) {
        System.out.println(matcher.group(1));
    }
}
于 2013-03-19T10:10:50.280 に答える
0

最初に正規表現をコンパイルしてから、マッチャーを使用して比較します。

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);
于 2013-03-19T09:48:17.710 に答える