regex - 在ruby中使用正则表达式删除引号周围的空格(撇号)
问题描述
我正在尝试使用一个 Ruby 正则表达式删除引号周围的所有空格。(和这个问题不一样)
- 输入: l' avant ou l 'après ou encore 'maintenant'
- 输出: l'avant ou l'après ou encore 'maintenant'
我尝试了什么:
(/'\s|\s'/, '')
它匹配少数情况,但不是全部。如何执行此操作?谢谢。
解决方案
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
,例如。
推荐阅读
- polymer - 一旦所有子元素都_实际上_更新后运行一个函数
- c# - 使用 Newtonsoft 在 C# 中使用 JSON Schema 验证 JSON
- java - 如何将本地日期与本地日期列表进行比较
- flutter - 如何在颤动中更改潜文本值的颜色
- php - 未定义变量/关联键的 PHP linter
- azure - Solr 7.6.0 是否存在不能使用系统全部数据传输容量的限制?
- c++ - 混合铸造指针和引用
- c - 如何修复这个简单的 do/while 循环?
- regex - PowerShell RegEx:从字符串中获取 SID
- ios - 当 iOS 应用程序被暂停/杀死并且用户点击通知时如何处理 Firebase 推送通知?