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

Ruby gsub case insensitive not working as expected

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

除了 upper/lower 大小写问题外,该功能运行良好。我将 ::IGNORECASE 添加到 gsub 中的正则表达式,但它似乎没有任何改变。下面是我获取字符串数组的函数:

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 替换为 space 同时保持原始缩写形式。


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

输入部分:

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>
Regexp.new 不同,

Regexp.union 无法指定选项。因此,returned 正则表达式没有启用的选项:

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

如果像 String#% 那样将结果转换为带有 Regexp#to_s 的字符串,也可以观察到这一点(注意扩展组中的 explicit 选项) :

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

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

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

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

除了使用 Regexp.union 之外,您还可以做的另一件事是手动构建正则表达式源代码:

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

输出:

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>