最近使用正则表达式进行了解释,当我尝试确认C:/Sonar/sonar-runner-dist-2.4/sonar-runner-2.4/projects/
函数未返回预期结果(preg_match()
)时。我已经意识到我的正则表达式会在部分匹配和完全匹配时评估为真。
任何更有经验的人都能分享一些关于为何这样做的评论吗?
我使用以下代码对此进行了测试:
false
在这种情况下,正则表达式返回<?php
# Storing regexp.
$pattern = "/Banana|Apples/i";
# Storing value that will be compared against regexp.
$value = "Chiiiiiiiibanana";
# Testing how preg_match is dealing with the regexp.
if (preg_match($pattern, $value, $matches)) {
echo "It's a match!\n";
# In case there's matches, print them.
print_r($matches);
} else {
echo "Sorry, not a match.";
}
?>
(true),尽管“1
”为“bananas
”前缀。有什么想法吗?
答案 0 :(得分:3)
要避免任何部分匹配,您必须使用锚点:
^
- 字符串的开头$
- 字符串结束。所以使用
$pattern = "/^(?:Banana|Apples)$/i";
请参阅demo
由于您有另一个列表,因此需要对它们进行分组,以便锚点正确应用,而不仅仅是第一个和最后一个备选方案。如果您使用"/^Banana|Apples$/i"
,则banana
中的bananas
和apples
中的=apples
会匹配。{/ p>
要仅对备选项进行分组但不存储在任何捕获组中,可以使用非捕获组((?:....)
)。此外,您不需要捕获整个模式上设置的组,因为整个匹配文本始终存储在组0中。