正则表达式单词边界的替代方案

7
我正在使用标准的\b单词边界。然而,它不能完全处理我想要的点(.)字符。
因此,下面的正则表达式: \b(\w+)\b 如果我有一个字符串说cats and dogs don't make cats.dogs,它将在cats.dog中匹配catsdogs
我需要一个单词边界的替代方案,只有当:
1. 它不包含点(.)字符 2. 它被至少一个空格( )字符封装在每一侧
时才匹配整个单词。
有什么想法吗?
附:我需要这个用于PHP。
2个回答

6
你可以尝试在\b的前面使用(?<=\s),在后面使用(?=\s),以确保它前后都有空格,但是你也可能需要考虑到在字符串的开头或结尾的情况,这时你可以使用(?<=\s|^)(?=\s|$)。这样会自动排除包含.的“单词”,但是也会排除句子末尾没有空格的单词。

谢谢。我是否可以在句子的开头和结尾包含单词?!我可能不需要它,但知道这一点可能会很有用。 - ObiHill

2

你试图匹配的内容可以很容易地使用数组和字符串函数完成。

$parts = explode(' ', $str);
$res = array_filter($parts, function($e){
   return $e!=="" && strpos($e,".")===false;
});

我推荐这种方法,因为它可以节省时间。否则浪费几个小时来寻找一个好的正则表达式解决方案是相当低效的。

我需要将这个作为另一个正则表达式的一部分,并作为 preg_replace 函数的第一步,因此它并不完全适用于我需要做的事情。 - ObiHill
最好先问清楚你实际需要什么。可能有比正则表达式更好的解决方案。 - Shiplu Mokaddim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接