正则表达式 - 一个词跟在另一个词之后
Regex - word followed after another word
我有 PHP 应用程序,我想得到字符串 "word" 后跟另一个词。它后面可以跟另一个字符串。
- 您好,这是状态:好的
- 您好,这是状态:好的。
- 您好,这是状态:好的,我喜欢。
我希望始终获得 "ok" 状态。请问如何操作?
我有:
preg_match('~status:\s(.*)(?=\s.*)?~', $text, $matches);
但是 returns status 之后的所有内容:.
您可以使用正向后视来做到这一点,并在它之后获取每个单词字符。
(?<=status:\s)(\w+)
您可以将 (.*)
替换为 (\w*)
:
preg_match('~status:\s(\w*)~', $text, $matches);
修复当前方法的另一种方法是使 (.*)
中的圆点变得惰性,然后对当前的前瞻性做一些细微的改变:
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);
我有 PHP 应用程序,我想得到字符串 "word" 后跟另一个词。它后面可以跟另一个字符串。
- 您好,这是状态:好的
- 您好,这是状态:好的。
- 您好,这是状态:好的,我喜欢。
我希望始终获得 "ok" 状态。请问如何操作?
我有:
preg_match('~status:\s(.*)(?=\s.*)?~', $text, $matches);
但是 returns status 之后的所有内容:.
您可以使用正向后视来做到这一点,并在它之后获取每个单词字符。
(?<=status:\s)(\w+)
您可以将 (.*)
替换为 (\w*)
:
preg_match('~status:\s(\w*)~', $text, $matches);
修复当前方法的另一种方法是使 (.*)
中的圆点变得惰性,然后对当前的前瞻性做一些细微的改变:
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);