正则表达式只允许在以's结尾的单词中使用撇号

时间:2011-04-01 15:16:47

标签: php regex

我正在阅读一些文件,我需要删除字符串中的所有撇号,除了以's结尾的单词中的撇号。

示例:

  

弗兰克的蓝色车 - >弗兰克的蓝色车

     

Frank'blue'汽车 - >弗兰克蓝车

     

'弗兰克的蓝色车 - >弗兰克的蓝色车

     

弗兰克的'蓝色'车 - >弗兰克的蓝色车

     

'弗兰克蓝车' - >弗兰克蓝车

     

Frank'blue'car - > Frankbluecar

提前感谢您的帮助!

编辑:修改后的问题,因为我只需要用's结尾的单词来保留撇号,而不仅仅是单数占有的。

4 个答案:

答案 0 :(得分:2)

所以基本上你想要禁止两边都没有字母包围的撇号。您可以尝试以下方法:

/(?<![a-z])'|'(?!s\b)/i

用空字符串替换与之匹配的任何内容。如果你想允许一些收缩,你可以稍微扩大它:

/(?<![a-z])'|'(?![a-z]\b)/i

这种模式符合您的要求,但我提供了一些注意事项:

  • 它会阻止'tis'twas,这些都是有效的英语。
  • 第一种模式将阻止大多数收缩,例如didn't
  • 如果没有英语词典数据库,就无法区分单数占有(例如Frank's)和以S结尾的收缩(例如she's)。
  • 最后,请记住,这也会阻止大多数复数。这句话是正确的英语,但它仍然会被阻止:

      

    儿童玩具

  •   

答案 1 :(得分:2)

试试这个: /(?<!s)'(?!s)\b/i

结果:

Frank's blue car   ->  NO Match
Frank 'blue' car   ->  Match two single quotes
'Frank's blue car  ->  Match first single quote only
Frank's' blue 'car ->  Match all single quotes except the one in Franck
'Frank blue car'   ->  Match all single quotes
Frank'blue'car     ->  Match all single quotes
cars'              ->  NO Match

答案 2 :(得分:1)

如何使用(')([^sS][^ ]|$)?它应匹配您要删除的所有撇号情况。然后,您应该使用第二个捕获组的内容替换整个匹配的内容。

编辑:正如评论中所讨论的那样,这不会出现在以{,cars' headlightsthe Jones' cat结尾的单词上删除尾随s的情况。< / p>

答案 3 :(得分:1)

除了
之外,该命令会删除所有周围的单引号 - 占有欲:母亲的妹妹...... - 短辅助动词:不是不是......

preg_replace("/(?<![a-z])'|'(?![st]\b)/i", '', $str)