使用正则表达式在Java中提取值

问题

我有粗糙的几个字符串:

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

我想使用Java Regex类提取[some number]中的文本。

我大致知道我想要使用的正则表达式(尽管欢迎所有建议)。我真正感兴趣的是Java调用获取正则表达式字符串并在源数据上使用它来产生[某个数字]的值。

编辑:我应该补充说,我只对一个某个数字感兴趣。源字符串很短,我不会寻找[某些数字]的多次出现。


#1 热门回答(261 赞)

完整示例:

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+).*

#2 热门回答(33 赞)

Allain基本上有java代码,所以你可以使用它。但是,他的表达只匹配数字,前面只有一个单词字符流。

"(\\d+)"

应该能够找到第一个数字串。如果你确定它将是第一个数字字符串,你不需要指定它之前的内容。同样,除非你想要,否则没有用来指定它之后的内容。如果你只是想要这个号码,并且确定它是一个或多个数字的第一个字符串,那么这就是你所需要的。

如果你希望它被空格偏移,那么它将使指定更加明显

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

可能会更好。

如果你需要这三个部分,这将做:

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

编辑Allain和Jack给出的表达式建议你需要指定一些非数字子集以便捕获。如果你告诉正则表达式引擎你正在寻找\d然后它会忽略数字之前的所有内容。如果J或A的表达式得到你的模式,那么整个matchequalstheinput字符串。并且没有理由指定它。如果不完全忽略它,它可能会减慢干净的匹配速度。


#3 热门回答(32 赞)

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