使用正则表达式(Java)从这些字符串中提取子字符串

使用正则表达式(Java)从这些字符串中提取子字符串,java,regex,Java,Regex,我正在尝试使用Java从以下字符串中提取TPS编号-字符串将从文件中读取,因此字符串可以以任何顺序出现(事先不知道),例如,我不知道我处理的是哪一个字符串-可能是这两个字符串之一: Testing performance TPS.. ok. (795 TPS recorded for run) Testing performance TPS.. warning: TPS seems low - it was 10 TPS and I expected to achieve over 50

我正在尝试使用Java从以下字符串中提取TPS编号-字符串将从文件中读取,因此字符串可以以任何顺序出现(事先不知道),例如,我不知道我处理的是哪一个字符串-可能是这两个字符串之一:

Testing performance TPS..  ok. (795 TPS recorded for run)

Testing performance TPS..  warning: TPS seems low - it was 10 TPS and I expected to achieve over 50
例如,对于第一个字符串,我想要数字795,对于第二个字符串,我想要数字10

有人知道如何使用正则表达式或类似的语言使用Java实现这一点吗


非常感谢

您需要在输入中找到第一组数字字符。数字以空格结尾

您可以使用此正则表达式:

    String regex = "[^\\d]+(\\d+) .*";
该号码在第一组(
$1
)中捕获

下面是一个简单的测试:

public static void main(String[] args) throws Exception {

    String[] lines = {
        "Testing performance TPS..  ok. (795 TPS recorded for run)",
        "Testing performance TPS..  warning: TPS seems low - it was 10 TPS and I expected to achieve over 50"
    };

    String regex = "[^\\d]+(\\d+) .*";
    Pattern p = Pattern.compile(regex);
    for (String s: lines) {
        Matcher m = p.matcher(s);
        if (m.matches()) {
            System.err.println(m.group(1));
        }
    }
}
输出为:

795
10

您需要在输入中找到第一组数字字符。数字以空格结尾

您可以使用此正则表达式:

    String regex = "[^\\d]+(\\d+) .*";
该号码在第一组(
$1
)中捕获

下面是一个简单的测试:

public static void main(String[] args) throws Exception {

    String[] lines = {
        "Testing performance TPS..  ok. (795 TPS recorded for run)",
        "Testing performance TPS..  warning: TPS seems low - it was 10 TPS and I expected to achieve over 50"
    };

    String regex = "[^\\d]+(\\d+) .*";
    Pattern p = Pattern.compile(regex);
    for (String s: lines) {
        Matcher m = p.matcher(s);
        if (m.matches()) {
            System.err.println(m.group(1));
        }
    }
}
输出为:

795
10

如果您总是在寻找一个后跟字符串“TPS”的整数,您可以这样做

"(\\d+) TPS"

但是,您最好确保它始终采用这种格式——如果可能的话,最好修改输出格式。

如果您总是在查找后跟字符串“TPS”的整数,您可以这样做

"(\\d+) TPS"

但您最好确保它始终采用这种格式——如果可能的话,最好修改输出格式。

这个正则表达式应该可以:

    ^[^0-9]*([0-9]+).*$
它匹配任何包含数字的行,并提取行中的第一个数字

然而,仅仅从这两个例子来概括是不可能的。例如,您没有向我们展示正则表达式不应该匹配的示例



我同意这样的评论,即这是一种提取信息的方式。除非你非常确定你的输入文本,否则你总是有可能遇到一种不同的形式,正则表达式无法处理;e、 g.在不应该匹配时匹配,反之亦然。

此正则表达式应实现以下功能:

    ^[^0-9]*([0-9]+).*$
它匹配任何包含数字的行,并提取行中的第一个数字

然而,仅仅从这两个例子来概括是不可能的。例如,您没有向我们展示正则表达式不应该匹配的示例



我同意这样的评论,即这是一种提取信息的方式。除非你非常确定你的输入文本,否则你总是有可能遇到一种不同的形式,正则表达式无法处理;e、 g.当它不应该匹配时匹配,反之亦然。

获取文本行中第一个数字的正则表达式如下:
^.*([0-9]*)
。这是获取这些数字的一种非常古怪的方法-您确定不能直接连接到文件的源代码,以及在文件中生成这些行的内容吗?这将是一种更好的获取所需数据的方法。如果不是,下面答案中的regexp将起作用,但请确保(在运行时)您正在读取具有正确(即预期)格式的行。获取文本行中第一个数字的regex如下所示:
^.*([0-9]*)
。这是获取这些数字的一种非常简单的方法-您确定不能直接连接到文件的源代码,以及文件中产生这些行的内容吗?这将是一种更好的获取所需数据的方法。如果不是,下面答案中的regexp将起作用,但请确保(在运行时)验证您正在阅读的行具有正确(即预期)的格式。在java中,只需使用if(matcher.groupCount()>=1){String groupStr=matcher.group(1);…}即可获得第一个捕获的组。第0组将是整个比赛,即“795 TPS”,第一组将只是“795”@PeterPerháč:这不是
groupCount()
的目的。有关详细信息,请参阅我对sudocode答案的评论。you win:-)伟大而简单的答案。。。我当然在想积极的外表落后之类的。。但这些是零宽度,不捕捉。。。然后你发了这封信,我就想噢!杰出的在java中,只需使用if(matcher.groupCount()>=1){String groupStr=matcher.group(1);…}即可获得第一个捕获的组。第0组将是整个比赛,即“795 TPS”,第一组将只是“795”@PeterPerháč:这不是
groupCount()
的目的。有关详细信息,请参阅我对sudocode答案的评论。you win:-)伟大而简单的答案。。。我当然在想积极的外表落后之类的。。但这些是零宽度,不捕捉。。。然后你发了这封信,我就想噢!您使用的
groupCount()
不正确。它只是告诉你正则表达式中有多少捕获组。它没有说任何关于实际匹配的内容。要确定第1组是否参加了比赛,请使用
if(m.group(1)!=null)
if(m.start(1)!=1)
@Alan谢谢你指出这一点,我不知道。因此,在尝试访问组之前,实际上只需要检查Matcher.matches()。如果模式匹配,则可以查找所有组,但有些组可能为null或空。使用
groupCount()
是不正确的。它只是告诉你正则表达式中有多少捕获组。它没有说任何关于实际匹配的内容。要确定第1组是否参加了比赛,请使用
if(m.group(1)!=null)
if(m.start(1)!=1)
@Alan谢谢你指出这一点,我不知道。因此,在尝试访问组之前,实际上只需要检查Matcher.matches()。如果模式匹配,则可以查找所有组,尽管有些组可能为null或空。