构建正则表达式

时间:2011-09-15 21:31:31

标签: regex

你能告诉我从下面的行中捕获类名的正则表达式:

[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

非常感谢任何帮助。

谢谢!

2 个答案:

答案 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没什么,但正则表达式让我想放弃编程。