【发布时间】:2016-12-30 13:06:59
【问题描述】:
我正在尝试使用 PCRE 正则表达式来匹配以下单词列表:
- 牛奶
- 鸡蛋
以下字符串:
milk, goatmilk, goat milk, cow milk, watch out for ( milk, eggs), egg, cornstarch
milk. goatmilk. goat milk. cow milk. watch out for ( milk, eggs). egg. cornstarch
milk goatmilk goat milk cow milk watch out for ( milk, eggs). egg cornstarch
这将是一个简单的练习,但遗憾的是它无法匹配以下任何单词:
- 羊奶
- 山羊奶
在上述情况下,字符串应该匹配,因为单词:
- 牛奶
- 鸡蛋
- 鸡蛋
但如果字符串中不包含任何这些词则不应该匹配,即:
sugar, wheat, goatmilk, goat milk, cornstarch
我尝试过应用这些但没有任何成功:
- Regex match these words, but exclude matches with these
- Regex to match a pattern, but exclude a set of words
- Regex to match all words except a given list
我从上述资源中得到的最接近的正则表达式是:
\b(?!(?:goatmilk|goat\smilk))(egg|milk)\b
这仍然会匹配所有单词牛奶,更糟糕的是它会因为单词边界而跳过单词鸡蛋。如果我删除边界这个词,它也会匹配 goatmilk..
我已经想到了使用两个正则表达式的可能性,一个匹配所有单词,另一个检查匹配单词中的排除单词。然而;如果不是山羊和牛奶之间的空间,这将非常有效,因为山羊部分不会在比赛中。
如果没有选项,我将使用 PHP 在空间上展开,遍历数组,如果找到匹配项,将检查先前的索引值以查看组合是否包含要排除的单词缓解空间问题。然而;我宁愿不使用它,因为我认为这个选项很丑:(
【问题讨论】:
-
类似
\b(?:egg|(?<!\bgoat|\bgoat\s)milk)\b?或者要匹配eggs,你需要adds?-eggs?。