首页 > 解决方案 > 在ruby中使用正则表达式删除引号周围的空格(撇号)

问题描述

我正在尝试使用一个 Ruby 正则表达式删除引号周围的所有空格。(和这个问题不一样)

我尝试了什么:

(/'\s|\s'/, '')

它匹配少数情况,但不是全部。如何执行此操作?谢谢。

标签: regexruby

解决方案


TLDR:

我假设这些空格是由某些自动化软件插入的,并且单词周围只能有单个空格。

s = "l' avant ou l 'apres ou encore ' maintenant' ou bien 'ceci ' et ' encore de l ' huile ' d 'accord d' accord d ' accord Je n' en ai pas .... s ' entendre Je m'appelle Victor"
first_rx = /(?<=\b[b-df-hj-np-tv-z]) ' ?(?=\p{L})|(?<=\b[b-df-hj-np-tv-z]) ?' (?=\p{L})/i
# If you find it overmatches, replace [b-df-hj-np-tv-z] with [dlnsmtc], 
# i.e. first letters of word that are usually contracted
second_rx = /\b'\b\K|' *((?:\b'\b|[^'])+)(?<=\S) *'/
puts s.gsub(first_rx, "'")
      .gsub(second_rx) { $~[1] ? "'#{$~[1]}'" : "" }    

输出:

l'avant ou l'apres ou encore 'maintenant' ou bien 'ceci' et 'encore de l'huile' d'accord d'accord d'accord Je n'en ai pas .... s'entendre Je m'appelle Victor

解释

问题真的很复杂。有几个单词可以缩写并与法语中的撇号一起使用,de, le/la, ne, se, me,te等等ce,但这些都是辅音。您可以使用删除单个独立辅音、撇号和下一个单词之间的所有空格

s.gsub(/(?<=\b[b-df-hj-np-tv-z]) ' ?(?=\p{L})|(?<=\b[b-df-hj-np-tv-z]) ?' (?=\p{L})/i, "'")

如果您发现它过度匹配,请替换[b-df-hj-np-tv-z][dlnsmtc],即通常收缩的单词的首字母。请参阅正则表达式演示

下一步是在初始撇号之后和尾随撇号之前删除空格。这很棘手:

s.gsub(/\b'\b\K|' *((?:\b'\b|[^'])+)(?<=\S) *'/) { $~[1] ? "'#{$~[1]}'" : "" }

where\b'\b旨在匹配单词字符之间的所有撇号,即我们在上一步中修复的那些。请参阅此正则表达式演示。由于(*SKIP)(*F)Onigmo 正则表达式不支持,正则表达式有点简化,但替换是有条件的:如果组 1 匹配,则替换为'+ 组 1 值 ( $1) + ',否则,替换为空字符串(因为\K重置匹配,从匹配内存缓冲区中删除所有文本)。

注意:这种方法可以扩展到处理一些特定的情况aujourd'hui,例如。


推荐阅读