2

次の文字列があるとします。

id: 1 name: Joe age: 27 id: 2 name: Mary age:22

そして、「age:」の後のすべてのトークンを抽出したいのですが、文字列「age:」自体は抽出したくありません。

だから私は、Matchergroup()年齢:27」と「年齢:22」ではなく、27と22を返すようにしたい

Java Regex 構文でこの命令を指定する方法はありますか?これは、正規表現の基礎を学んだ Perl の構文とはかなり異なるようです。

これは私のコードです:

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

public class RegExTest 
{
    public static void main(String[] args) 
    {
        Pattern namePtrn = Pattern.compile("age: *\\w*");

        String data = "id: 1 name: Joe age:27 id: 2 name: Mary age:22";

        Matcher nameMtchr = namePtrn.matcher(data);

        while(nameMtchr.find())
        {
            String find = nameMtchr.group();

            System.out.println ("\t" + find);
        }
    }
}

Perl では、{} を使用して抽出したいパターンの部分を制限できます

while($text =~ m/(age:{\w+})/g)
{
      my $find = $1;

      if($find)
      {
          print "\nFIND = ".$find;
      }
}

戻るだろう

FIND = 27
FIND = 22

{} を age のように入れると

while($text =~ m/({age:\w+})/g)

それは戻るだろう

FIND = age: 27
FIND = age:22

そこで、Perl の {} のようなものを Java で探しています。

4

3 に答える 3

7

Matcher.group(1)代わりに使用するとMatcher.group()、「age:」を除いたパターンをキャプチャできます。

String data = "id: 1 name: Joe age:27 id: 2 name: Mary age:22";
Pattern namePtrn = Pattern.compile("age:(\\w+)");
Matcher nameMtchr = namePtrn.matcher(data);

while (nameMtchr.find()) {
   String find = nameMtchr.group(1);
   System.out.println("\t" + find);
}
于 2012-10-08T19:09:03.393 に答える
1

試す:

age:\s*(\d+)

「age:」の後に任意の量の空白が続き、その後に 1 つ以上の数字が続くものと一致します。数字 (数値) は最初のグループに取り込まれます。

負の年齢をサポートしたい場合 (つまり、「年齢不明」の場合は -1 など)、次を使用できます。

age:\s*(-?\d+)

これは、"age:" の後に任意の量の空白が続き、その後にゼロまたは 1 つのマイナス記号が続き、その後に 1 つ以上の数字が続くものと一致します。数字とオプションのマイナス記号 (数値) は最初のグループに取り込まれます。

キャプチャ グループを機能させる方法がわからない場合は、いくつかの例があるこの質問を参照してください。

于 2012-10-08T19:01:59.567 に答える
0

エスケープされていない括弧を使用します。

Pattern namePtrn = Pattern.compile("age: *(\\w*)");

これにより、Matcher の最初のキャプチャ グループに配置されます。

于 2012-10-08T19:03:03.390 に答える