你能告诉我从下面的行中捕获类名的正则表达式:
[2011-09-14 20:43:31:943 GMT][E08C17F94E8.http-8080-Processor21]com.abc.MyClass] INFO login successful
在这里,我需要捕获MyClass
。
到目前为止,我能够使用com.abc.MyClass
(?i)^(?:[^\[]*\[){3}
但我无法捕获MyClass
。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
如果结尾(表示“登录成功”的部分)有可能有括号,你可以使用:
^\[[^]]*\]\[[^]]*\][^]]*\.([^]]+)\].*$
让我们看看我是否可以将其分解......
^\[[^]]*\]
匹配第一个括号,所有后跟非“]”字符和一个右括号。这是[2011-09-14 20:43:31:943 GMT]
部分。
\[[^]]*\]
匹配一个左括号,所有后跟非“]”字符和另一个右括号。这是[E08C17F94E8.http-8080-Processor21]
部分。
[^]]*\.([^]]+)
然后匹配所有非“]”字符,后跟一个句点,后跟一个或多个非“]”字符。这是com.abc.MyClass
部分。 MyClass
部分与括号中的部分匹配。
\].*$
匹配结束括号和字符串的其余部分。这是] INFO login successful
部分。
因此,如果您在示例中将^\[[^]]*\]\[[^]]*\][^]]*\.([^]]+)\].*$
替换为$1
,则会留下MyClass
。
答案 1 :(得分:0)
如果你可以假设在最后一个之后从来没有括号,那很简单:
(\w+)\][^]]$
这会捕获字符串中最后一个]
之前的所有字母数字字符。
注意:您不需要执行[^\]]
,因为PCRE的规范说如果]
是字符列表中的第一个,则无需转义它。
编辑:由于您不能假设没有括号,这是另一个可行的:
\[.+?\]\[.+?\].*?(\w+)\]
这会丢弃前两组括号,并在下一个括号之前抓取最大的一组字母数字字符。 ?
中的.+?
使其成为非贪婪的乘数,因此它会将与尽可能少的字符匹配,这使得此正则表达式非常简单有效。
对阵daxnitro没什么,但正则表达式让我想放弃编程。