从字符串中准确捕获2个单词

时间:2014-02-11 19:54:14

标签: php regex

我正在使用正则表达式来解析看起来像这样的命令:

!hello foo bar

我想捕获foobar。如果该命令只传递了2个参数,那么我希望正则表达式失败。

到目前为止,这是我的正则表达式:

^!hello (.*)$

我知道可以使用{2}来限制捕获的数量,但我不确定在这种情况下如何使用它。

由于

2 个答案:

答案 0 :(得分:5)

我建议使用更具体的内容(例如(.*))来匹配一个或多个“字”字符,而不是贪婪的\w+。由于空格可能无关紧要,请将它们与\s+分开。而不是尝试使用{2},因为您期望两个用空格分隔,因此更容易将每个组拼写为\w+,并且中间有空格要求。

^!hello\s+(\w+)\s+(\w+)$

如果您实际上不需要重复使用参数,请删除()

^!hello\s+\w+\s+\w+$

$pattern = '/^!hello\s+\w+\s+\w+$/';
echo preg_match($pattern, '!hello foo bar');
// 1
echo preg_match($pattern, '!hello foo bar baz');
// 0
echo preg_match($pattern, '!hello "foo bar" baz');
// 0
// Note a numeric argument matches \w+... If that isn't allowed
// you should use [A-Za-z]+ instead or just [a-z]+ and add the /i flag
echo preg_match($pattern, '!hello 123 baz');
// 1
echo preg_match($pattern, '!hello a$1 baz');
// 0

答案 1 :(得分:1)

。*捕获所有内容,包括空格。你想要做的是捕获一个或多个字符的运行,这些字符可以是但是空格,然后是一些空格,然后是另一组非空白字符。

使用正则表达式语法捕获它的方法是:

^!hello\s+(\S+)\s+(\S+)\s*$

注意使用+代替* - 你必须在单词之间至少有一个空格,0个空格是不可接受的。每个单词也必须至少有一个字符。这也允许一系列尾随空格。

请注意\ S将识别任何不是空白的内容。这意味着

hello %__ second_word

会匹配。如果您只想匹配单词的单词字符,请使用\ w而不是\ S(有关不同generic character types的定义,请参阅[HP手册],或创建自己character class的说明。