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 ")
我想发生的是,我的方法将匹配\nAbbrev
或Abbrev\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>
,你可以做的,而不是使用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>
哦,谢谢,整洁 - 不知道这个伎俩。你介意告诉我那个'&'在那里做什么? – MrVocabulary
@iyoossaev:它将由'Object#method'返回的'Proc'转换为一个块,正如'Enumerable#map'所预期的那样。它在功能上等同于'.map {| w | Regexp.escape(w)}' – Amadan
有趣的是,我想我明白答案......谢谢! =] – MrVocabulary
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#source
关于由Regexp.union
编制的正则表达式。它的返回值中不包含选项关闭扩展组的东西(?-mix:
和)
:
Regexp.union(%w(a b c)).source # => "a|b|c"
好的,这很有趣 - 不知道关于Regexp.union。我尝试了,现在要做的就是 'matchRegexPrefix = Regexp.new( “\ n(%{} abbrevReplace)” %{ abbrevReplace:Regexp.union(some_array) })。source' 然后: 'stringToBeFixed .gsub!(/#{regexAbbrev [0]}/i,“\\ 1”)' 但它仍然不能按照我希望的方式工作。 – MrVocabulary
我是否正确理解混合在转换为正常正则表达式后无法正常工作?有趣的想法虽然,但我得到的正则表达式仍然包含这个'?混合:'部分。 – MrVocabulary
@iyoossaev:你的新代码有同样的问题:regexp没有选项('Regexp :: IGNORECASE'去了哪里?)。只需将'.source'(两次)添加到Q中的代码中,您就可以得到预期的输出。 – cremno
您能否提供一个[MVCE(最小完整可验证示例)](http://stackoverflow.com/help/mcve)?示例输入,expec特德产量也会非常有帮助。 –
按要求完成:) – MrVocabulary
那么,你尝试使用内联选项'(?i)'?例如。 ' “(我)\ N(%{abbrevReplace})”'? –