Ruby gsub 不区分大小写未按预期工作
Ruby gsub case insensitive not working as expected
我对 gsub 使用的正则表达式有问题。我的程序中有问题的部分加载了两个文本文件:一个它可以处理,另一个作为缩写数组。问题是我想删除任何缩写之前或之后的任何 \n
s(我故意将它们分开)。这不是真正的问题,我的解决方案有效,但缩写可能是大写或小写,而我的列表只包含每个版本的一个版本(大小写混合)。
除了 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 ")
我想要发生的是我的方法将匹配 \nAbbrev
或 Abbrev\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>
我对 gsub 使用的正则表达式有问题。我的程序中有问题的部分加载了两个文本文件:一个它可以处理,另一个作为缩写数组。问题是我想删除任何缩写之前或之后的任何 \n
s(我故意将它们分开)。这不是真正的问题,我的解决方案有效,但缩写可能是大写或小写,而我的列表只包含每个版本的一个版本(大小写混合)。
除了 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 ")
我想要发生的是我的方法将匹配 \nAbbrev
或 Abbrev\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>