我正在使用正则表达式来解析看起来像这样的命令:
!hello foo bar
我想捕获foo
和bar
。如果该命令只传递了2个参数,那么我希望正则表达式失败。
到目前为止,这是我的正则表达式:
^!hello (.*)$
我知道可以使用{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的说明。