Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用正则表达式返回字符串前缀,其中stripped字符串有时包含'/';_Ruby_Regex_String - Fatal编程技术网

Ruby 使用正则表达式返回字符串前缀,其中stripped字符串有时包含'/';

Ruby 使用正则表达式返回字符串前缀,其中stripped字符串有时包含'/';,ruby,regex,string,Ruby,Regex,String,我试图返回字符串的前缀,我的相关问题在这里,但我遇到了一个新问题 基本上我有一个字符串,比如 23430-BL 23430BZ 23430BK/BL 23430-BL 23430BZ 23430BK/BL 我试图删除的扩展是 strip_ext = BK/BL|BZ|BL 带外=BK/BL | BZ | BL 我用来获取不带扩展名的字符串的正则表达式是 prefix = sample_data[/(.*[^-])-?(?:#{strip_ext})/,1] 前缀=样本数据[/(.[^-])-?

我试图返回字符串的前缀,我的相关问题在这里,但我遇到了一个新问题

基本上我有一个字符串,比如

23430-BL 23430BZ 23430BK/BL 23430-BL 23430BZ 23430BK/BL 我试图删除的扩展是

strip_ext = BK/BL|BZ|BL 带外=BK/BL | BZ | BL 我用来获取不带扩展名的字符串的正则表达式是

prefix = sample_data[/(.*[^-])-?(?:#{strip_ext})/,1] 前缀=样本数据[/(.[^-])-?(?:{strip\u ext})/,1] 这又回来了

23430 23430 23430-BK 23430 23430 23430-BK 理论上,我理解regexp查找BL匹配,并且出于某种原因选择它作为BK/BL的匹配。但是有没有办法让regexp查找BK/BL而不是BL

不幸的是,在我想要脱掉的部分之前并不总是有破折号

我添加了原始的strip_ext列表作为示例,并认为这将使其易于理解。实际的strip_ext列表如下所示,并根据提供的样本数据进行更改,因此不幸的是,它不像下面Mu的答案那么简单

AM/DB|AM/BN|RD/BK|PR/WT|YP/BN|YP/CH|YP/DB|PK/BN|PK/CH|PK/DB|SF/BN|SF/CH|SF/DB|AM/CH|BN/CH|BN/DB|CH/BN|CH/DB|DB/BN|DB/CH|BN/BN|CH/CH|MR/BN|MR/CH|MR/DB|DB/DB|AM/AB|DIC/BN|DIC/CH|DIC/DB|BN|DB|WT|BN/WT|BK|WT/BN|BK/BN|BK/DB|BL/BN|BL/DB|BK/CH|BL/CH|AM|CH|FR|SB|AM/BK|AM/WT|PT/CH|BG/CH|BG/DB|MF/CH|MF/DB|YR/CH|YR/DB|WT/DB|pt/bn 我的名字,那个么,YP/C,YP/C,YP/C,YP/C,YP/C,YP/C,YP/C/DB,PK/B,AM/A,AM/AM,AM/DB,AM/B,AM/B,AM/B,AM/B,AM/AM,AM/B,AM/M,AM,AM,P/A/A,AM,AM,M/P/B,AM,A/KKKKKKKKKKKKKKKKKKKKKKK/KKKB/DB,那个那个男男男男男男男男男男男男男男男男的,B,B,B,B,AM/DB,AM,AM,AM/B,AM,AM,AM,AM,AM/B,AM/B,AM/B,AM,AM,AM/B,AM,AM,AM,B,AM/B,AM,B,AM/B,AM,B,AM,AM“DIC”DI124,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DB,DI124,DB,B,B,B,BBK,BK,BK,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIC,DIwt/DB | PT/BN
你可以在你的
BL
matcher中混入一个负面观察:

/(.*[^-])-?(?:BK\/BL|BZ|(?<!BK\/)BL)/
但是,您的示例输出与输入不匹配,“GR”是输入中的错误还是“BZ”是正则表达式中的错误


鉴于您的模式是不固定的,您可以完全绕过正则表达式,转而使用简单的字符串争用。下面是我在评论中提到的一个更好的例子:

require 'set'

# The suffix list that you get from somewhere.
suffixes  = [ 'BK/BL', 'BZ', 'BL' ]

# We want to do a couple things at once here. For each suffix, we
# want both the suffix and the suffix with a leading '-' attached,
# the `map` and `flatten` stuff does that. Then we group them by
# length to get a hash like:
#
#     { 2 => ['BZ','BL'], 3 => ['-BZ', '-BL'], 5 => ['BK/BL'], ... }
#
by_length = suffixes.map { |suffix| [suffix, '-' + suffix ] }.flatten.group_by(&:length)

# Now we reorganize our suffixes into sets with the set of longest
# suffixes first and the set of shortest suffixes last. The result
# will be:
#
#     [#<Set: {"-BK/BL"}>, #<Set: {"BK/BL"}>, #<Set: {"-BZ", "-BL"}>, #<Set: {"BZ", "BL"}>]
#
sets = by_length.keys.sort { |a,b| b <=> a }.map { |k| Set.new(by_length[k]) }

# Then we can just spin through sets, pull off the suffix of the
# appropriate length from the string, and see if it is in our set.
# If it is then chop the suffix off the string, do whatever is to be
# done with chopped string, and break out for the next string.
#
%w{ 23430-BL 23430BZ 23430BK/BL }.each do |string|
    sets.each do |suffixes|
        len = suffixes.first.length
        sfx = string[string.length - len, len]
        if(suffixes.include?(sfx))
            puts string[0 .. -(len + 1)]
            break
        end
    end
end
require'set'
#从某处获得的后缀列表。
后缀=['BK/BL','BZ','BL']
#我们想在这里同时做几件事。对于每个后缀,我们
#要同时使用后缀和带有前导“-”的后缀,
#“地图”和“展平”的东西就是这么做的。然后我们把他们按顺序分组
#获取散列的长度,如:
#
#{2=>['BZ','BL'],3=>['-BZ','-BL'],5=>['BK/BL'],…}
#
by|length=suffix.map{| suffix |[suffix',-'+suffix]}.flatte.group|u by(&:length)
#现在,我们将后缀重新组织为具有最长后缀集的集合
#后缀在前,最短后缀集在后。结果
#将是:
#
#     [#, #, #, #]
#
Set=by|length.keys.sort{a,b | ba}.map{k | Set.new(by|length[k])
#然后我们就可以旋转集合,去掉
#从字符串中选择适当的长度,然后查看它是否在我们的集合中。
#如果是这样的话,就把后缀从字符串上切掉,做任何想做的事
#用切碎的字符串完成,然后开始下一个字符串。
#
%w{23430-BL 23430BZ 23430BK/BL}。每个do|字符串|
set.each do |后缀|
len=后缀.first.length
sfx=string[string.length-len,len]
if(后缀包括?(sfx))
放置字符串[0..-(len+1)]
打破
终止
终止
终止

这只是对算法的一个“从头到脚”的说明。

将第一个量词ungreedy

(.*?[^-])-?(?:BK/BL|BZ|BL)
看到了吗


使
*?
尽可能不匹配。

谢谢,我修复了示例数据中的错误。不幸的是,我在编程中得到了需要分条的扩展列表,因为它根据不同的输入数据列表而变化。我只是在这里提供了一个子集。我不认为我可以用编程的方式来编写lookbehind,因为找到所有可能需要lookbehind的strip_ext将是一项艰巨的任务。我在问题中添加了一个实际的strip_ext列表,以了解我实际处理的数据。不过,感谢您提供的查找信息,我相信这会在下次派上用场。@pedalpete:您可以按长度对后缀进行分组,将它们放入一组(每种长度一组),然后为每根字符串拉出长度为4的后缀,如果它在长度为4的后缀集中,则设置,然后尝试长度3,从最长的后缀到最短的后缀。基本上完全抛弃正则表达式,使用简单的字符串操作。正则表达式是很好的工具,但还有其他工具。@pedalpete:如果您有兴趣,我添加了一个非正则表达式方法的更新。谢谢您的帮助,最初我正在寻找一种非正则表达式方法来实现这一点,因此您的所有工作可能在将来派上用场。谢谢你经历了这些麻烦。斯泰玛的回答显然更符合我的意思。@pedalpete:那么是
*
?我习惯于使用
*?
所以我完全错过了:)哇!我想知道为什么它不像树梢解析器那样贪婪。谢谢
(.*?[^-])-?(?:BK/BL|BZ|BL)