我有以下字符串:
(^\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])){
有没有办法绕过这种行为?
答案 0 :(得分:1)
您可以使用以下正则表达式:
^([^>-][^:]*)\s*:\s*([^:\n]+)
作为Java字符串:
String pattern = "(?m)^([^>-][^:]*)\\s*:\\s*([^:\\n]+)";
请参阅demo
[^>-]
确保我们不会捕获以>
或-
开头的行。由于[^:]
模式,它还捕获多行名称。
否定字符类[^:]
表示不是:
的任何字符(甚至是换行符号)。由于:
充当分隔符,因此我们可以匹配之前的任何内容,以及之后的任何内容。我将\n
添加到匹配值的第二个否定字符类(例如0
s)以确保我们停在换行符处,因为下一行可能以键名开头。
输出: