我希望有一个正则表达式,它给出了在单引号/空格中插入的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 [Core] Class 在类加载器中找不到'org.jboss.weld.metadata.TypeStore' 'org.jboss.modules.ModuleClassLoader@4ebded0b'。
预期输出org.jboss.modules.ModuleClassLoader@4ebded0b
2014-05-21 22:04:34.591 INFO [Core]开始插件 org.zeroturnaround.javarebel.integration.IntegrationPlugin来自 /Users/endragor/Downloads/jrebel/jrebel.jar in 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
如果类加载器字符串是行的末尾,即上面的示例-3,我的正则表达式也不会处理。我该怎么做才能考虑'
或\\s
而不是两者
答案 0 :(得分:2)
试试这个:
String extractedValue=yourString.replaceAll("(.*)([ '])(.*ClassLoader.*?)(\\2)(.*)", "$3");
每当我们想要在一组预先设定的值之间提取String时,第一个和最后一个分隔符应该具有相同的值,我们可以使用Backreference功能。
答案 1 :(得分:1)
由于操作员更改了原始帖子,因此这里是更新后的答案。
只需使用以下模式检查toString()
类的默认Object
表示。
[\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
答案 2 :(得分:1)
这个正则表达式应该没有分组:
[^\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