正则表达式,包含不同行中的单词

时间:2015-05-12 08:13:29

标签: java regex

我有以下字符串:

(^\w+\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*:\s*\d+)

我想从此字符串中提取键值对。我创造了一个“丑陋”的正则表达式:

>stat f

它只是检查单词和空格等,并且有效。我想要一个更漂亮的方式:向我提供所有不以-<开头的行,并且不要以(^[^><-].*) 开头。我试过这个

 Activate Context Request Tim

但是当一个键延伸到两行时,它会将它们作为两个不同的东西匹配。那是我得到的一场比赛

 eouts                       :             0

和一个

if (is_callable(array($this->GRules,$this->RuleName)))
   if( call_user_func($this->GRules->$this->RuleName,$this->_Fields[1])){

有没有办法绕过这种行为?

1 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

^([^>-][^:]*)\s*:\s*([^:\n]+)

作为Java字符串:

 String pattern = "(?m)^([^>-][^:]*)\\s*:\\s*([^:\\n]+)";

请参阅demo

[^>-]确保我们不会捕获以>-开头的行。由于[^:]模式,它还捕获多行名称。

否定字符类[^:]表示不是: 的任何字符(甚至是换行符号)。由于:充当分隔符,因此我们可以匹配之前的任何内容,以及之后的任何内容。我将\n添加到匹配值的第二个否定字符类(例如0 s)以确保我们停在换行符处,因为下一行可能以键名开头。

输出:

enter image description here

相关问题