用Regexp.Union扫描如何在并\ b \ ix中使用带有选项的变量?

时间:2018-08-26 16:36:32

标签: ruby regex

我需要用硬编码的regex.union值替换我从文件中读取的值。我无法使它起作用,让我们说出\b字边界。在示例的底部,我有一个很好的案例,并且发现regex1regex2是不同的。如何附加特殊的?-mix:并使\b/ix工作?

   s = '/*  aaa SElect /*   selectXXX  ZZZ_Select '

   puts '--------------------  1  no results here'
RegexData = ['/*', 'select']             # this arrage got values from file
puts 'Regexdata ' + RegexData[0].chomp + '    ' + RegexData[1].chomp  

regex1 = Regexp.union(RegexData[0].chomp , RegexData[1].chomp)       #add ALL elements from RegexData???
puts  'r1             ' +regex1.to_s
puts  'scan1 ' + s.scan(regex1).to_s

puts '--------------------  2 works OK for test '
regex2 = Regexp.union(/\/\*/,/\bselect\b/ix,/myTable/)
puts 'r2              ' + regex2.to_s
#(?-mix:(?-mix:\/\*)|(?ix-m:\bselect\b)|(?-mix:myTable))
puts  'scan2 ' + s.scan(regex2).to_s

1 个答案:

答案 0 :(得分:1)

这种方式对我有效,您可以将变量传递到regex中,语法非常复杂,但是可以正常工作!如果每个元素的选项不同,则将所有数组元素馈入联合c会更加复杂。注意#和大括号的用法。

s = ' select /*  aaa Select /*   SElectXXX  ZZZ_SelecT '
regex1 = '\bselect\b'            # | /\bselect\b/ix|(?-mix:myTable))'
regex2 = '\/\*'              
puts  'scan1 ' + s.scan(/#{regex1}/ix).to_s

好问题,没错,全包。祝好运! 更多好的技巧在这里 enter link description here

它也适用于Union,但请注意,它不是解析数组的元素,而只是解析固定数目的元素,在这种情况下为= 2。

regu = Regexp.union(/#{regex2}/, /#{regex1}/ix)
puts  'scanUN ' + s.scan(regu).to_s
#scanUN ["select", "/*", "Select", "/*"]