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

Cra*_*ker 160 java regex

我有粗糙的几个字符串:

[some text] [some number] [some more text]
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我应该补充一点,我只对一个[某个数字](基本上是第一个实例)感兴趣.源字符串很短,我不会寻找[某些数字]的多次出现.

All*_*nde 302

完整示例:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

既然你正在寻找第一个数字,你可以使用这样的正则表达式:

^\D+(\d+).*
Run Code Online (Sandbox Code Playgroud)

并且m.group(1)会回报你的第一个数字.请注意,带符号的数字可以包含减号:

^\D+(-?\d+).*
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记重用Patter对象.编译模式需要花费大量时间. (62认同)
  • 没有解释,这是一个糟糕的答案. (15认同)
  • 同意.通常我会将模式定义为私有静态最终模式PATTERN = Pattern.compile("..."); 但那只是我. (14认同)
  • 我们可以简单地使用Pattern p = Pattern.compile("\\ d +"); (6认同)
  • 这种方法有一个警告,在@Marquez 的回答中暗示:Matcher 是一个状态机。这还包括 `p.matcher(<string>).group()` 会抛出错误,因为匹配器只是被创建。在调用 .find() 之前,您需要实际存储匹配器并通过调用 `.find()` 来运行它。作为一个 FP 的人,我在前两个小时没有出现这种情况(记录 .find() 总是返回 true,但 .group() 总是抛出......)。 (2认同)

jav*_*Man 38

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1234
789
2345
Run Code Online (Sandbox Code Playgroud)


Axe*_*man 33

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

"(\\d+)"
Run Code Online (Sandbox Code Playgroud)

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

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

"\\s+(\\d+)\\s+"
Run Code Online (Sandbox Code Playgroud)

可能会更好.

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

"(\\D+)(\\d+)(.*)"
Run Code Online (Sandbox Code Playgroud)

编辑 Allain和Jack给出的表达式建议您需要指定一些非数字子集以捕获数字.如果你告诉正在寻找的正则表达式引擎\d那么它将忽略数字之前的所有内容.如果J或A的表达适合你的模式,那么整个比赛等于输入字符串.并且没有理由指定它.如果没有完全忽略它,它可能会减慢干净的匹配.


Vit*_*nko 11

除了Pattern之外,Java String类还有几个可以使用正则表达式的方法,在这种情况下,代码将是:

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")
Run Code Online (Sandbox Code Playgroud)

哪里\\D是非数字字符.


Jac*_*eow 10

在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);
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*zka 8

此函数从字符串中收集所有匹配的序列.在此示例中,它从字符串中获取所有电子邮件地址

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;
}
Run Code Online (Sandbox Code Playgroud)

因为message = "adf@gmail.com, <another@osiem.osiem>>>> lalala@aaa.pl"它将创建3个元素的列表.