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

时间:2018-12-04 06:40:24

标签: regex preg-match

说我有以下列表:

  • 香蕉
  • 苹果

我有这个字符串:

  

这香蕉成熟了。昨天苹果发生了什么事?

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

\bbanana\b

这将捕获上述字符串的“香蕉”部分。

在第二次迭代中,如果我执行相同的串联操作,则会得到以下信息:

\bapple(s)\b

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

我可以将我的列表项串联起来,以便正确捕获bananaapple(s)吗?要捕获的子字符串可以在字符串中的任何位置,包括字符串的开头或结尾。

我正在使用PHP。

1 个答案:

答案 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>