正则表达式 - 如何处理单词边界问题?
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)
不匹配,因为右括号不是单词字符。
我可以将什么连接到我的列表项以便我可以正确捕获 banana
和 apple(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
单词边界标记旨在查找单词与非单词之间的边界,而不是非单词与其他非单词之间的边界.
假设我有以下列表:
- 香蕉
- 苹果
我有这个字符串:
This banana is ripe. What happened to the apple(s) yesterday?
我想遍历我的列表并搜索整个单词匹配的字符串。在第一次迭代中,我可以将单词边界连接到列表项:
\bbanana\b
这将捕获上述字符串的 "banana" 部分。
在第二次迭代中,如果我进行相同的串联,我会得到:
\bapple(s)\b
这与我的字符串中的 apple(s)
不匹配,因为右括号不是单词字符。
我可以将什么连接到我的列表项以便我可以正确捕获 banana
和 apple(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
单词边界标记旨在查找单词与非单词之间的边界,而不是非单词与其他非单词之间的边界.