Regex 在ruby中删除带有正则表达式的引号周围的空格(撇号)

Regex 在ruby中删除带有正则表达式的引号周围的空格(撇号),regex,ruby,Regex,Ruby,我试图用一个Ruby正则表达式删除引号周围的所有空格。(与问题不同) 输入:l‘avant ou l’après ou encore‘maintenant’ 输出:l'avant ou l'après ou encore'maintenant' 我尝试的是: (/'\s|\s'/, '') 它匹配了一些案例,但不是全部。 如何执行此操作?谢谢。要删除周围的所有空白,请使用,分几个步骤应用以正确删除空白: str = "l' avant ou l 'apres ou encore

我试图用一个Ruby正则表达式删除引号周围的所有空格。(与问题不同)

  • 输入:l‘avant ou l’après ou encore‘maintenant’
  • 输出:l'avant ou l'après ou encore'maintenant'
我尝试的是:

(/'\s|\s'/, '')
它匹配了一些案例,但不是全部。
如何执行此操作?谢谢。

要删除
周围的所有空白,请使用,分几个步骤应用以正确删除空白:

str = "l' avant ou l 'apres ou encore ' maintenant'"
str.gsub!(/\b'\s+\b/, "'").gsub!(/\b\s+'\b/, "'").gsub!(/\b(\s+')\s+\b/, '\1')
puts str
# l'avant ou l'apres ou encore 'maintenant'
这里,
\b
:单词边界,
\s+
:1个或多个空格,
string.gsub!(regex,replacement\u string)
:用指定的
replacement\u string
替换
参数
regex
中的
字符串(在此过程中,原始
字符串
被更改),

\1
:在替换字符串中,这是指正则表达式中括号中捕获的第一个组:
(…)

我相信以下内容对您适用

s.gsub(/'.*?'/){ |e| "'#{e[1...-1].strip}'" }

正则表达式部分匹配单引号(包括引号)内的所有文本。然后,对于每个匹配项,用删除的前导和尾随空格替换被引用的文本,并以引号返回该文本。

因此,如果您有大量这样的数据,我看到的所有答案都是错误的,并且不起作用。没有正则表达式可以猜测前面的单词是否应该有空格。除非你列出了一个单词(或模式)的列表,这些单词或做或不做

问题是,有时应该留一个空间,有时不留。编写脚本的唯一方法是找到一个模式,该模式描述空间何时应该存在,何时不应该存在。你必须教你的正则法语语法。这可能是lol,但可能不是,或者很难

如果这是一次性的,我的建议是为2或3种不同的情况创建正则表达式,并使用vim之类的工具来检查数据,然后手动选择yes或no来替换每个事件

可能有些情况下您可以运行-例如删除引号右侧的所有空格?-但不幸的是,我认为您无法自动化此过程。

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]}'" : "" }    
解释

问题真的很复杂。法语中有几个单词可以缩写并加撇号使用,
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'\b
意味着匹配单词字符之间的所有apsotrophes,即我们在上一步修复的那些字符。看见由于Onigmo正则表达式中没有
(*SKIP)(*F)
支持,正则表达式稍微简化了一点,但替换是有条件的:如果组1匹配,则替换为
'
+组1值(
$1
)+
'
,否则替换为空字符串(由于
\K
重置了匹配,因此删除了匹配内存缓冲区中的所有文本)


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

尝试用
/\b'\s\b/
替换为
'
Hi-Wiktor。它只匹配句子中的一个结果……你是什么意思?
s.gsub(/\b'\s\b/,“”)
?当你有
encore'maintenant
时,规则是什么?规则是删除引号后面的空格,在单词=>
encore'maintenant'
之前。正如我的一样,如果引号在两个引号之间的单词前面的两个空格之间,它就不起作用了。它与引号前面的空格相匹配,而在这个uniq案例中则不匹配。参见ere:@alex.bour fixed非常好Timur!它更复杂。它适用于我的案例。但是,最后一件事(对不起)。我将尝试以下内容:
“l'avant ou l'apres ou encore'maintenant'ou bien'ceci'”
我需要增强最后一个新案例(字后空格,引用前空格).@alex.bour请编辑问题并添加此项,以及所需结果,以便每个人都能轻松看到。否则,很难看到。此外,根据所需结果,可能需要在问题中指定撇号应指向何处的规则(对于边缘情况)。嗨,Robert。不,它与引号周围的2个空格相匹配当
单词“test”
时,但是应该让1.哦,我明白你的意思了,让我做一些修改,然后这涵盖了很多情况,应该是被接受的答案。嗨,维克斯特。感谢这个涵盖了很多情况的详细答案。这将是我扩展它的基础。这个问题正如你所说的那样复杂,而且更复杂,因为我还有其他的问题要管理的er语言(例如意大利语中的“Dell'a”)。
s.gsub(/(?<=\b[b-df-hj-np-tv-z]) ' ?(?=\p{L})|(?<=\b[b-df-hj-np-tv-z]) ?' (?=\p{L})/i, "'")
s.gsub(/\b'\b\K|' *((?:\b'\b|[^'])+)(?<=\S) *'/) { $~[1] ? "'#{$~[1]}'" : "" }