如何使用正则表达式提取子字符串

时间:2017-04-28 13:00:52

标签: java regex

我是java正则表达式的新手。我需要提取“com.mycomp.war.tasks.JmxMetricsTask” 从下面的线。我怎么处理正则表达式?

String test = "id=         com.mycomp.war.tasks.JmxMetricsTask      I run/id-geLh3hM1-1_2 [Svc--DAG]";

太复杂了吗? 正则表达式有可能吗? 我需要提取上面的回报吗?

VG

3 个答案:

答案 0 :(得分:0)

您需要更彻底地定义问题和要求。

对于您展示的示例,有一个更简单的解决方案:

String test = "id=         com.mycomp.war.tasks.JmxMetricsTask      I run/id-geLh3hM1-1_2 [Svc--DAG]";
String answer = test.substring(3).trim().split(" ", 2)[0];

免责声明:这可能不适用于所有可能的输入。这就是为什么我说你需要完全定义你的情况。如果您的所有输入都与我根据您的一个示例所做的假设相匹配,那么这将不使用正则表达式。

答案 1 :(得分:0)

不需要正则表达式。你可以像

那样做
String test = "id=         com.mycomp.war.tasks.JmxMetricsTask      I run/id-geLh3hM1-1_2 [Svc--DAG]";
String subTest = "com.mycomp.war.tasks.JmxMetricsTask";
test.substring(test.indexOf(subTest), subTest.length() + test.indexOf(subTest));

但你能解释一下你的实际要求吗?使用上面的内容,您可以获得所需的字符串部分

答案 2 :(得分:-1)

好吧,你可以搜索一个类似的问题。

  

regexp to match java package name

我从顶部答案修改了正则表达式以适合您的情况。我将^…$(行开头/结尾)部分替换为\b(字边界)。

import java.util.regex.*;

public class RegexTest {
    public static final String PACKAGE_PATTERN = "\\b[a-z][a-z0-9_]*(\\.[a-z0-9_]+)+[0-9a-z_]\\b";

    public static void main(String[] args) {
        String s = "id=         com.mycomp.war.tasks.JmxMetricsTask      I run/id-geLh3hM1-1_2 [Svc--DAG]";
        Pattern p = Pattern.compile(PACKAGE_PATTERN, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(s);

        if (m.find()) {
            System.out.println(m.group()); // com.mycomp.war.tasks.JmxMetricsTask
        }
    }
}

以下是使用Regex 101的实时示例:/\b[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]\b/ig

  

https://regex101.com/r/RwJtLK/2

你也可以用空白字符拆分并抓住第二个令牌。

public class RegexTest {        
    public static void main(String[] args) {
        String s = "id=         com.mycomp.war.tasks.JmxMetricsTask      I run/id-geLh3hM1-1_2 [Svc--DAG]";
        String[] tokens = s.split("\\s+");

        System.out.println(tokens[1]); // com.mycomp.war.tasks
    }
}