RegexpError:具有不匹配括号的结束模式

时间:2016-09-09 06:00:51

标签: ruby regex

我有 作为字符串的品牌列表  brands = 'Lawrence Bill Lawrence OBL Billdidit Binson Bitchstraps Biyang Black Arts'非常大

如果我的字符串包含其中一个

,我希望它找到
my_str = ' txt txt OBL txt'

my_str[(/#{brands}/)]

但我有RegexpError: end pattern with unmatched parenthesis

我做错了什么?

2 个答案:

答案 0 :(得分:0)

如果你想“查找我的字符串是否包含其中一个字符串”,则不需要正则表达式:

brands = %w|BAR FOO|
my_str = ' txt txt BAR txt'
brands.any? { |brand| my_str.include? brand }
#⇒ true
brands.detect { |brand| my_str.include? brand }
#⇒ "BAR"

不幸的是,这会匹配BAR等字符串中的text FOOBARBAZ text。为了避免这种情况:

my_str =~ Regexp.union brand.map(&:Regexp.escape).map { |e| "\b#{e}\b" }

事实上,由于Regexp.union会转义字符串本身,因此应将其写为:

my_str =~ Regexp.union brand.map { |e| "\b#{e}\b" }

对于那些懒得理解普通英语的人:

my_str.scan Regexp.union brand.map { |e| "\b#{e}\b" }

答案 1 :(得分:0)

pattern = Regexp::union(brands.strip.split(/\W+/))
# => "/Lawrence|Bill|OBL|Billdidit|Binson|Bitchstraps|Biyang|Black|Arts/"

my_str.match(pattern)
# => #<MatchData "OBL">

my_str.scan(pattern)
# => ["OBL"]