web-dev-qa-db-ja.com

正規表現を使用してJavaの値を抽出する

大まかな形式のいくつかの文字列があります。

[some text] [some number] [some more text]

Java Regexクラスを使用して[some number]のテキストを抽出します。

使用する正規表現を大まかに知っています(ただし、すべての提案を歓迎します)。私が本当に興味を持っているのは、正規表現文字列を取得してソースデータで使用して[some number]の値を生成するJava呼び出しです。

編集:私は単一の[いくつかの番号](基本的に、最初のインスタンス)にのみ興味があることを追加する必要があります。ソース文字列は短く、[いくつかの番号]の複数の出現を探しているつもりはありません。

152
Craig Walker

完全な例:

private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)");
public static void main(String[] args) {
    // create matcher for pattern p and given string
    Matcher m = p.matcher("Testing123Testing");

    // if an occurrence if a pattern was found in a given string...
    if (m.find()) {
        // ...then you can use group() methods.
        System.out.println(m.group(0)); // whole matched expression
        System.out.println(m.group(1)); // first expression from round brackets (Testing)
        System.out.println(m.group(2)); // second one (123)
        System.out.println(m.group(3)); // third one (Testing)
    }
}

最初の番号を探しているので、そのような正規表現を使用できます。

^\D+(\d+).*

m.group(1)は最初の番号を返します。符号付き数字にはマイナス記号を含めることができることに注意してください。

^\D+(-?\d+).*
292
Allain Lalonde
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

public class Regex1 {
    public static void main(String[]args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("hello1234goodboy789very2345");
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

出力:

1234
789
2345
36
javaMan

Allainには基本的にJavaコードがあるため、それを使用できます。ただし、彼の表現はifにのみ一致します。数字の前にはWord文字のストリームのみが付きます。

"(\\d+)"

最初の数字列を見つけることができるはずです。最初の数字列であることが確実な場合は、その前に何を指定する必要はありません。同様に、あなたがそれを望んでいない限り、その後に何を指定するのも意味がありません。数字だけが必要で、それが1つ以上の数字の最初の文字列であることが確実な場合、必要なのはそれだけです。

スペースでオフセットされると予想される場合は、指定することがさらに明確になります

"\\s+(\\d+)\\s+"

より良いかもしれません。

3つの部分すべてが必要な場合は、次のようにします。

"(\\D+)(\\d+)(.*)"

EDIT AllainとJackの式は、digitsをキャプチャするために、非数字のサブセットを指定する必要があることを示唆しています。正規表現エンジンに\dを探していると伝えると、数字の前のすべてを無視します。 JまたはAの式がパターンに適合する場合、マッチ全体equals入力文字列。そして、それを指定する理由はありません。完全に無視されない場合、クリーンマッチの速度が低下する可能性があります。

33
Axeman

Pattern に加えて、Java String クラスには、正規表現で動作できるいくつかのメソッドもあります。コードは次のようになります。

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")

ここで、\\Dは数字以外の文字です。

11

Java 1.4以降:

String input = "...";
Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
    // if you need this to be an int:
    int someNumberInt = Integer.parseInt(someNumberStr);
}
10
Jack Leow

この関数は、stringから一致するすべてのシーケンスを収集します。この例では、stringからすべての電子メールアドレスを取得します。

static final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";

public List<String> getAllEmails(String message) {      
    List<String> result = null;
    Matcher matcher = Pattern.compile(EMAIL_PATTERN).matcher(message);

    if (matcher.find()) {
        result = new ArrayList<String>();
        result.add(matcher.group());

        while (matcher.find()) {
            result.add(matcher.group());
        }
    }

    return result;
}

message = "[email protected], <[email protected]>>>> [email protected]"の場合、3つの要素のリストを作成します。

6
LukaszTaraszka

このようなことを試してください:

Pattern p = Pattern.compile("^.+(\\d+).+");
Matcher m = p.matcher("Testing123Testing");

if (m.find()) {
    System.out.println(m.group(1));
}
3
Tint Naing Win

シンプルなソリューション

// Regexplanation:
// ^       beginning of line
// \\D+    1+ non-digit characters
// (\\d+)  1+ digit characters in a capture group
// .*      0+ any character
String regexStr = "^\\D+(\\d+).*";

// Compile the regex String into a Pattern
Pattern p = Pattern.compile(regexStr);

// Create a matcher with the input String
Matcher m = p.matcher(inputStr);

// If we find a match
if (m.find()) {
    // Get the String from the first capture group
    String someDigits = m.group(1);
    // ...do something with someDigits
}

Utilクラスのソリューション

public class MyUtil {
    private static Pattern pattern = Pattern.compile("^\\D+(\\d+).*");
    private static Matcher matcher = pattern.matcher("");

    // Assumptions: inputStr is a non-null String
    public static String extractFirstNumber(String inputStr){
        // Reset the matcher with a new input String
        matcher.reset(inputStr);

        // Check if there's a match
        if(matcher.find()){
            // Return the number (in the first capture group)
            return matcher.group(1);
        }else{
            // Return some default value, if there is no match
            return null;
        }
    }
}

...

// Use the util function and print out the result
String firstNum = MyUtil.extractFirstNumber("Testing4234Things");
System.out.println(firstNum);
2
NoBrainer

あなたはStringTokenizerを使用してそれを行うことができる見て

String str = "as:"+123+"as:"+234+"as:"+345;
StringTokenizer st = new StringTokenizer(str,"as:");

while(st.hasMoreTokens())
{
  String k = st.nextToken();    // you will get first numeric data i.e 123
  int kk = Integer.parseInt(k);
  System.out.println("k string token in integer        " + kk);

  String k1 = st.nextToken();   //  you will get second numeric data i.e 234
  int kk1 = Integer.parseInt(k1);
  System.out.println("new string k1 token in integer   :" + kk1);

  String k2 = st.nextToken();   //  you will get third numeric data i.e 345
  int kk2 = Integer.parseInt(k2);
  System.out.println("k2 string token is in integer   : " + kk2);
}

これらの数値データを3つの異なる変数に取り込むため、このデータをコード内の任意の場所で使用できます(さらに使用するため)

1
shounak

[^\\d]*([0-9]+[\\s]*[.,]{0,1}[\\s]*[0-9]*).*についてはどうですか?小数部分の数値を処理すると思います。空白を含め、可能なセパレータとして,を含めました。私はフロートを含む文字列から数字を取得しようとしていますが、ユーザーが間違いを犯し、数字を入力するときに空白を含める可能性があることを考慮しています。

0
arturo

Java.lang.Stringで利用可能な単純な.split( "REGEXP")メソッドを使用できる場合があります。例えば:

String input = "first,second,third";

//To retrieve 'first' 
input.split(",")[0] 
//second
input.split(",")[1]
//third
input.split(",")[2]
0
user1722707
Pattern p = Pattern.compile("(\\D+)(\\d+)(.*)");
Matcher m = p.matcher("this is your number:1234 thank you");
if (m.find()) {
    String someNumberStr = m.group(2);
    int someNumberInt = Integer.parseInt(someNumberStr);
}
0
User User