【问题标题】:Get String in between either single quotes or empty space在单引号或空格之间获取字符串
【发布时间】:2014-06-05 13:25:28
【问题描述】:

我希望有一个正则表达式,它给我插入单引号/空格的 classLoader 的名称,但不是两者的混合。 即一些例子。 :

2014-05-21 22:05:13.685 TRACE [核心] sun.misc.Launcher$AppClassLoader@62c8aeb3 搜索资源 'java/util/LoggerFactory.class'。

预期输出sun.misc.Launcher$AppClassLoader@62c8aeb3

2014-05-21 22:05:13.685 TRACE [核心] 类 在类加载器中找不到“org.jboss.weld.metadata.TypeStore” 'org.jboss.modules.ModuleClassLoader@4ebded0b'。

预期输出org.jboss.modules.ModuleClassLoader@4ebded0b

2014-05-21 22:04:34.591 INFO [核心] 启动插件 org.zeroturnaround.javarebel.integration.IntegrationPlugin 来自 /Users/endrgor/Downloads/jrebel/jrebel.jar 在 sun.misc.Launcher$AppClassLoader@62c8aeb3

预期输出sun.misc.Launcher$AppClassLoader@62c8aeb3

请注意,对于最后一个示例,该行以换行符结尾。即前面什么都没有。

这是我尝试过的".*[\\s|'](.*ClassLoader.*[^']*)['|\\s].*"。但它不起作用。对于第一个示例,它在下面给出而不是sun.misc.Launcher$AppClassLoader@62c8aeb3

sun.misc.Launcher$AppClassLoader@62c8aeb3 搜索资源 'java/util/LoggerFactory.class

如果类加载器字符串位于行尾,即上面的 example-3,我的正则表达式也无法处理。我该怎么做才能考虑 '\\s 但不能同时考虑

【问题讨论】:

    标签: java regex


    【解决方案1】:

    试试这个:

    String extractedValue=yourString.replaceAll("(.*)([ '])(.*ClassLoader.*?)(\\2)(.*)", "$3");
    

    每当我们想要在一组预定义的值之间提取字符串时,其中第一个和最后一个分隔符应该具有相同的值,我们可以使用Backreference 功能。

    【讨论】:

    • 因为我认为字符串末尾没有空格
    • 是的 :) 我们也需要处理这种情况
    • 但是 \\2 是什么意思?
    • 这是对第二组 ([ ']) 的反向引用,请查看我的答案中的链接。
    • 如果你想处理没有空格的情况,那么在(\\2)之后添加*
    【解决方案2】:

    这个正则表达式应该不用分组:

    [^\s']*ClassLoader[^\s']*
    

    在java中应该是:

    [^\\s']*ClassLoader[^\\s']*
    

    [..] 中不需要管道|,在正则表达式中[abcd] 表示a or b or c or d

    更新

    添加java代码:

    public static void main(String[] args){
            Pattern p = Pattern.compile("[^\\s']*ClassLoader[^\\s']*");
            Matcher m = p.matcher("2014-05-21 22:05:13.685 TRACE [Core] sun.misc.Launcher$AppClassLoader@62c8aeb3 searching for resource 'java/util/LoggerFactory.class'.");
            if (m.find()) {
                System.out.println(m.group());
            }
        }
    

    输出:

    sun.misc.Launcher$AppClassLoader@62c8aeb3
    

    【讨论】:

    • 我需要分组,因为我需要提取ClassLoader的名称。
    • 感谢您的帮助:)。但是上面的不匹配:(
    • @Jatin 你写的java代码正确吗?查看更新,我为您的 example1 添加了 java 代码。
    • 糟糕。它不适用于此:2014-05-21 22:05:10.583 INFO [Core] org.jboss.modules.ModuleClassLoader@4ebded0b 检测类 'com.spirent.rlm.core.app.internal.StatelessService' 来自'虚拟资源 [com/spirent/rlm/core/app/internal/StatelessService.class, 目录 [/Users/endragor/Work/ilo/iTestLabOptimizer/src/rlm-core/target/classes, []]]'。跨度>
    • 即如果我用上面的字符串做 m.find,它会返回 false
    【解决方案3】:

    由于运营商更改了原始帖子,所以这里是更新的答案。

    只需使用以下模式来检查Object 类的默认toString() 表示。

    [\w\.$]+ClassLoader@[a-z0-9]+
    

    模式到期:

    \w      A word character: [a-zA-Z_0-9]
    X+      X, one or more times
    
    [abc]   a, b, or c (simple class)
    

    快照:

    这里是DEMO

    【讨论】:

    • 我认为你误解了这个问题:) String after --> 是我期望从前字符串得到的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多