说我有以下列表:
我有这个字符串:
这香蕉成熟了。昨天苹果发生了什么事?
我想遍历列表,并在字符串中搜索整个单词匹配项。在第一次迭代中,我可以将单词边界连接到列表项:
\bbanana\b
这将捕获上述字符串的“香蕉”部分。
在第二次迭代中,如果我执行相同的串联操作,则会得到以下信息:
\bapple(s)\b
这与我字符串中的apple(s)
不匹配,因为右括号不是单词字符。
我可以将我的列表项串联起来,以便正确捕获banana
和apple(s)
吗?要捕获的子字符串可以在字符串中的任何位置,包括字符串的开头或结尾。
我正在使用PHP。
答案 0 :(得分:3)
这是一种方法。通过使用环顾四周,我们可以手动模拟单词边界标记,而不考虑字符类型。对于左侧上的\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)
)
正则表达式似乎是一个非常以文本为中心的工具,因此\b
单词边界标记旨在查找单词和非单词之间的边界,而不是非单词和其他非单词之间的边界。 / p>