Ruby gsub不区分大小写不能正常工作

时间:2015-07-21 08:20:17

标签: ruby regex gsub

我正在使用gsub的正则表达式有问题。我的程序中有问题的部分会加载两个文本文件:一个将处理,另一个作为缩写数组。问题是我想删除任何缩写之前或之后的任何\n(我故意将它们分开)。这不是一个真正的问题,我的解决方案有效,但缩写可能是大写或小写,而我的列表只包含一个版本(混合大小写)。

除大/小写问题外,该功能正常。我在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,并将空格替换为空格,同时将缩写保留为原始格式。

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

输入部分:

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>

2 个答案:

答案 0 :(得分:2)

您可以做的另一件事是使用Regexp.union来手动构建Regexp源:

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>

答案 1 :(得分:1)

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

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

如果结果转换为Regexp#to_s类似String#%的字符串,也可以观察到这一点(注意扩展组的显式选项):

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

这意味着当您隐式执行此方法时,将继承选项。

您可以在Regexp.union编译的正则表达式上调用Regexp#source。其返回值不包含关于扩展组内容的选项(?-mix:)

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