Ruby регулярное выражение: объединение 2K значений в одном регулярном выражении, - PullRequest
0 голосов
/ 19 сентября 2018

Я кодирую процесс для обработки группы текстовых файлов и фиксирую его имя, если в нем существует какой-либо из 2000 литералов (1 или много).Так что я думаю объединить столько значений в одно регулярное выражение, как вы думаете, это выполнимо, я проверил на 100 и похоже, что все в порядке.Tx весь код ниже отображает мой поток и пример кода, просто без зацикливания.

# 1. read regex value list as file [alpha,fox, delta]  # 2000 values
# 2. read file into s                 #5000 files
# 3. find if any of #1 values exists in each #2 file. *with regex tweaks to match format  dbname.dob.table

s = '1 dbName.dbo.ALPHA  2 DBNAME.bcd.ALPHA  3 dbName..ALPHA   4 ALPHA 5x dbName.alphA  6x  alpha.XX  7x ###dbName.###a.alpha  --alpha
       dbName..FOX  dbName.dbo.DELTA    clarity.aba..fox  '

value1 = '(?<=^|\s)(?:dbName\.[a-z]*\.)?(?:alpha)(?=\s|$)'
value2 = '(?<=^|\s)(?:dbName\.[a-z]*\.)?(?:fox)(?=\s|$)'
##...
value2000 = '(?<=^|\s)(?:dbName\.[a-z]*\.)?(?:delta)(?=\s|$)'

regex = /#{value1}|#{value2}|#{value2000}/i           ## can I union 2000 regex's ???
puts 'reg1: ' + regex.to_s
puts 'result: ' + s.scan(regex).to_s
if s.scan(regex)  then  puts '...Match!!!d' end

1 Ответ

0 голосов
/ 19 сентября 2018

Объявление 2000 переменных крайне не нужно;Вы должны определить все значения в одном массиве, а затем как-то перебрать их.

Кроме того, регулярное выражение является очень повторяющимся - например, использование (?:dbName\.[a-z]*\.) 2000 раз.Это можно упростить, сгруппировав все ваши значения в группу без захвата следующим образом:

values = %w(alpha fox delta)
regex = /(?<=^|\s)(?:dbName\.[a-z]*\.)?(?:#{Regexp.union(values)})(?=\s|$)/

Это результат:

/(?<=^|\s)(?:dbName\.[a-z]*\.)?(?:(?-mix:alpha|fox|delta))(?=\s|$)/

Если вы расширите этот массив valuesчтобы содержать 2000 строк, другой код не нужно менять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...