正则表达式 - 如何处理单词边界问题?

Regex - how to handle word boundaries problem?

假设我有以下列表:

我有这个字符串:

This banana is ripe. What happened to the apple(s) yesterday?

我想遍历我的列表并搜索整个单词匹配的字符串。在第一次迭代中,我可以将单词边界连接到列表项:

\bbanana\b

这将捕获上述字符串的 "banana" 部分。

在第二次迭代中,如果我进行相同的串联,我会得到:

\bapple(s)\b

这与我的字符串中的 apple(s) 不匹配,因为右括号不是单词字符。

我可以将什么连接到我的列表项以便我可以正确捕获 bananaapple(s)?要捕获的子字符串可以在字符串中的任何位置,包括它的开头或结尾。

我正在使用 PHP。

这是一种方法。无论字符类型如何,我们都可以使用环视来手动模拟单词边界标记。对于左边的\b,我们可以使用(?<=[\s.,;]|^),对于右边的\b,我们可以使用(?=[\s.,;]|$)

$input = "This banana is ripe. What happened to the apple(s) yesterday?";
preg_match_all ("/(?<=[\s.,;]|^)apple\(s\)(?=[\s.,;]|$)/", $input, $array);
print_r($array[0]);

Array
(
    [0] => apple(s)
)

Regex 似乎是一个非常以文本为中心的工具,因此,\b 单词边界标记旨在查找单词与非单词之间的边界,而不是非单词与其他非单词之间的边界.