Ruby gsub不区分大小写不按预期方式工作

Ruby gsub不区分大小写不按预期方式工作

问题描述:

我遇到了一个正在使用的gsub正则表达式的问题。我的程序中有问题的部分会加载两个文本文件:一个文本文件可用,另一个用作缩略词数组。问题是我想删除任何直接位于任何缩写之前或之后的任何\n(我故意将它们分开)。这不是一个真正的问题,我的解决方案的工作原理,但缩写可能是大写或小写,而我的列表只包含每个版本(混合大写和小写)。Ruby gsub不区分大小写不按预期方式工作

该功能工作正常,除大写/小写问题。我在gsub中将::IGNORECASE添加到正则表达式中,但它似乎没有改变任何内容。下面是我的函数,得到一个字符串数组:

def generateRegexes(some_array) 
    matchRegexPrefix = Regexp.new("\n(%{abbrevReplace})" % { 
     abbrevReplace: Regexp.union(some_array) 
    }, Regexp::IGNORECASE) 
    matchRegexSuffix = Regexp.new("(%{abbrevReplace})\n" % { 
     abbrevReplace: Regexp.union(some_array) 
    }, Regexp::IGNORECASE) 
    return [matchRegexPrefix, matchRegexSuffix] 
end 

,这里是我如何调用该函数:

regexAbbrev = generateRegexes listOfAbbreviations 
stringToBeFixed.gsub!(regexAbbrev [0], " \\1") 
stringToBeFixed.gsub!(regexAbbrev [1], "\\1 ") 

我想发生的是,我的方法将匹配\nAbbrevAbbrev\n不管并用空格替换\ n,同时将缩写保留在原始格式中。


编辑:提供请求的信息(不介意波兰语的乱码)。

部分输入:

Fum, u, lm. y 1. † dym, wyziew, para: Fumy do głowy z picia biją. 
Troc. 2. † pachnidło, perfumy, kosmetyk. 
Zdr. † Fumik. <Łć. fumus> 
× Fungować, uje, ował sprawować urząd, wypełniać obowiązki: Funguje jako poseł królewski. 
Szuj. <Łć. fungi> 
Funkcja, i, lm. e 1. sprawa załatwiania. Zdr. 
Funkcyjka. <Łć. functio> 

缩写列表的一部分:

Troc. 
Szuj. 
zdr. 

预期输出:

Fum, u, lm. y 1. † dym, wyziew, para: Fumy do głowy z picia biją. Troc. 2. † pachnidło, perfumy, kosmetyk. Zdr. † Fumik. <Łć. fumus> 
× Fungować, uje, ował sprawować urząd, wypełniać obowiązki: Funguje jako poseł królewski. Szuj. <Łć. fungi> 
Funkcja, i, lm. e 1. sprawa załatwiania. Zdr. Funkcyjka. <Łć. functio> 

输出我真正得到(我想要的一半):

Fum, u, lm. y 1. † dym, wyziew, para: Fumy do głowy z picia biją. Troc. 2. † pachnidło, perfumy, kosmetyk. 
Zdr. † Fumik. <Łć. fumus> 
× Fungować, uje, ował sprawować urząd, wypełniać obowiązki: Funguje jako poseł królewski. Szuj. <Łć. fungi> 
Funkcja, i, lm. e 1. sprawa załatwiania. Zdr. 
Funkcyjka. <Łć. functio> 
+3

您能否提供一个[MVCE(最小完整可验证示例)](http://stackoverflow.com/help/mcve)?示例输入,expec特德产量也会非常有帮助。 –

+0

按要求完成:) – MrVocabulary

+0

那么,你尝试使用内联选项'(?i)'?例如。 ' “(我)\ N(%{abbrevReplace})”'? –

,你可以做的,而不是使用Regexp.union的另一件事是手动构建您的正则表达式来源:

pattern = some_array.map(&Regexp.method(:escape)).join('|') 
text.gsub(/\n(#{pattern})/i, ' \1').gsub(/(#{pattern})\n/i, '\1 ') 

输出:

Fum, u, lm. y 1. † dym, wyziew, para: Fumy do głowy z picia biją. Troc. 2. † pachnidło, perfumy, kosmetyk. Zdr. † Fumik. <Łć. fumus> 
× Fungować, uje, ował sprawować urząd, wypełniać obowiązki: Funguje jako poseł królewski. Szuj. <Łć. fungi> 
Funkcja, i, lm. e 1. sprawa załatwiania. Zdr. Funkcyjka. <Łć. functio> 
+0

哦,谢谢,整洁 - 不知道这个伎俩。你介意告诉我那个'&'在那里做什么? – MrVocabulary

+1

@iyoossaev:它将由'Object#method'返回的'Proc'转换为一个块,正如'Enumerable#map'所预期的那样。它在功能上等同于'.map {| w | Regexp.escape(w)}' – Amadan

+0

有趣的是,我想我明白答案......谢谢! =] – MrVocabulary

Regexp.union没有指定选项的方法,与Regexp.new不同。返回的正则表达式因此没有启动的选项:

Regexp.union(%w(a b c)).options # => 0 

这也可以观察到如果结果被转换成Regexp#to_sString#%串并(注意明确选项关闭扩展组):

Regexp.union(%w(a b c)).to_s # => "(?-mix:a|b|c)" 

这意味着当您隐式地调用此方法时,将继承选项。

你可以拨打Regexp#source关于由Regexp.union编制的正则表达式。它的返回值中不包含选项关闭扩展组的东西(?-mix:)

Regexp.union(%w(a b c)).source # => "a|b|c" 
+0

好的,这很有趣 - 不知道关于Regexp.union。我尝试了,现在要做的就是 'matchRegexPrefix = Regexp.new( “\ n(%{} abbrevReplace)” %{ abbrevReplace:Regexp.union(some_array) })。source' 然后: 'stringToBeFixed .gsub!(/#{regexAbbrev [0]}/i,“\\ 1”)' 但它仍然不能按照我希望的方式工作。 – MrVocabulary

+0

我是否正确理解混合在转换为正常正则表达式后无法正常工作?有趣的想法虽然,但我得到的正则表达式仍然包含这个'?混合:'部分。 – MrVocabulary

+1

@iyoossaev:你的新代码有同样的问题:regexp没有选项('Regexp :: IGNORECASE'去了哪里?)。只需将'.source'(两次)添加到Q中的代码中,您就可以得到预期的输出。 – cremno