正则表达式 - 一个词跟在另一个词之后

Regex - word followed after another word

我有 PHP 应用程序,我想得到字符串 "word" 后跟另一个词。它后面可以跟另一个字符串。

  1. 您好,这是状态:好的
  2. 您好,这是状态:好的。
  3. 您好,这是状态:好的,我喜欢。

我希望始终获得 "ok" 状态。请问如何操作?

我有:

preg_match('~status:\s(.*)(?=\s.*)?~', $text, $matches);

但是 returns status 之后的所有内容:.

您可以使用正向后视来做到这一点,并在它之后获取每个单词字符。

(?<=status:\s)(\w+)

Demo

您可以将 (.*) 替换为 (\w*):

preg_match('~status:\s(\w*)~', $text, $matches);

Demo

修复当前方法的另一种方法是使 (.*) 中的圆点变得惰性,然后对当前的前瞻性做一些细微的改变:

preg_match('~status:\s(.*?)(?=\s|$)~', $text, $matches);

您可能会问为什么您当前的解决方案不起作用?

如果你看到它在匹配 status: 之后匹配了一个白色 space 字符,那么匹配到 .* 的行尾,然后回溯以找到 space 存在。如果 ok 之后的 whitespace 不立即存在,或者在字符串后面的某处不存在,则找不到匹配项。解决方案:

status:\s+\K\w+

您不需要捕获组,也不应该量化前瞻。

看直播demo here

PHP代码:

preg_match('~status:\s+\K\w+~', $text, $matches);