我有几个粗略形式的字符串:

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

我想使用Java Regex类提取[一些数字]中的文本。

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

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


当前回答

在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);
}

其他回答

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

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

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 = "adf@gmail.com, <another@osiem.osiem>>>> lalala@aaa.pl",它将创建包含3个元素的List。

如果你正在从文件中读取,那么这可以帮助你

              try{
             InputStream inputStream = (InputStream) mnpMainBean.getUploadedBulk().getInputStream();
             BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
             String line;
             //Ref:03
             while ((line = br.readLine()) != null) {
                if (line.matches("[A-Z],\\d,(\\d*,){2}(\\s*\\d*\\|\\d*:)+")) {
                     String[] splitRecord = line.split(",");
                     //do something
                 }
                 else{
                     br.close();
                     //error
                     return;
                 }
             }
                br.close();

             }
         }
         catch (IOException  ioExpception){
             logger.logDebug("Exception " + ioExpception.getStackTrace());
         }

如何(^ \ \ d) * ([0 - 9] + [\ \ s] * [,] {0,1} \ \ [s] *[0 - 9] *)。*我认为它可以处理小数部分的数字。 我加入了空白和可能的分隔符。 我试图得到的数字从一个字符串,包括浮动,并考虑到用户可能会犯一个错误,并包括空白,而键入的数字。

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

"(\\d+)"

应该能找到第一串数字。你不需要指定在它之前是什么,如果你确定它将是第一个数字字符串。同样地,指定后面是什么也没有用,除非你想要那样做。如果你只是想要一个数字,并确定它将是一个或多个数字的第一个字符串,那么这就是你所需要的。

如果您希望它被空格抵消,它将使指定更加明显

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

可能会更好。

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

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

编辑Allain和Jack给出的表达式建议您需要指定非数字的某个子集以捕获数字。如果你告诉正则表达式引擎你正在寻找\d,那么它将忽略数字之前的所有内容。如果J或A的表达式符合您的模式,则整个匹配等于输入字符串。没有理由指定它。如果它没有被完全忽略的话,它可能会降低匹配的速度。