似乎无法得到正确的PHP正则表达式量词
问题描述:
我有一个字符串,它看起来像这样:似乎无法得到正确的PHP正则表达式量词
msg": "log domain jl.lab.test.net server lab-jl-ppr-web"
我试图提取“jl.lab.test.net”,公正“的实验室-JL -ppr”,从 “实验室JL-PPR-网” 使用以下正则表达式:
preg_match("/\"msg\"\: \"log domain\s([\w*\.]*) server ([\w*\.\-]*)/i",$line,$matches);
第二组当前匹配的整个 “实验室JL-PPR-网” 的字符串。我一直在试图说明适当的量词,但到目前为止我还没有得到正确的量词。我试过以下内容:
preg_match("/\"msg\"\: \"log domain\s([\w*\.]*) server ([\w*\.\-]*){3}/i",$line,$matches);
我继续玩它,但如果你有任何提示,我会很感激。 谢谢。
答
为什么不
/..snip.. server ([\w*\.\-]*)-web/i
?只要保留-web
以外的捕获组。
答
这似乎是合法的,但我确信可以写得更好。
^log domain ([a-zA-Z\.]+) server ([a-zA-Z\.\-]+)-web$
在这里你可以preg_match_all
功能测试
答
用下面的办法:
$str = "log domain jl.lab.test.net server lab-jl-ppr-web";
preg_match_all("/\b\w+\.\w+\.\w+\.\w+\b|\b\w+-\w+-\w+(?=-\w+?)\b/U", $str, $matches);
print_r($matches[0]);
输出:
Array
(
[0] => jl.lab.test.net
[1] => lab-jl-ppr
)
答
这可能适用
'~"msg":[ ]"log[ ]domain\s([\w.]*)[ ]server[ ]((?:(?!-web)[\w.-])*)~'
但是,很难从正则表达式中找到你要找的东西。
扩展
"msg": [ ] "log [ ] domain \s
([\w.]*) # (1)
[ ] server [ ]
( # (2 start)
(?:
(?! -web)
[\w.-]
)*
) # (2 end)
输出
** Grp 0 - (pos 0 , len 52)
"msg": "log domain jl.lab.test.net server lab-jl-ppr
** Grp 1 - (pos 19 , len 15)
jl.lab.test.net
** Grp 2 - (pos 42 , len 10)
lab-jl-ppr
请更新您的问题,包括了几个例子,和你预期的最终输出,是您目前使用使得混乱的措辞。 – cmorrissey
'[]'匹配单个字符,'[] {3}'匹配连续3个指定字符。它不会匹配3个字符的3个组。 –