Регулярное выражение внутри регулярного выражения

#regex #eclipse #multiline

#регулярное выражение #eclipse #многострочный

Вопрос:

У меня есть CSV-файл, который дал мне клиент, который мне нужно превратить в набор инструкций if для программы, над которой я работаю. Данные выглядят следующим образом:

 Alfred E. Burr     A.E Burr     A.E Bu     Burr
A.I Prince     Prince R.V.T.S     Prince Tech
  

И мне нужно превратить это в:

 if(school IS 'Alfred E. Burr' OR school IS 'A.E Burr' OR school IS 'A.E Bu' OR schools IS 'Burr')
else if(school IS 'A.I Prince' OR school IS 'Prince R.V.T.S' OR school IS 'Prince Tech')
  

У меня уже есть код, который следует за написанным оператором if. Я бы вручную его закодировал, но в списке ~ 150 школ.

На данный момент я создал это регулярное выражение, которое соответствует целой строке, но я не уверен, что смогу использовать созданное в нем подвыражение для соответствия каждой школе в строке:

 ^(([A-Za-z0-9. amp;'] )t?) $
  

Итак, работая с этой базой, как бы я закодировал регулярное выражение для соответствия каждой строке, а затем внутри этих строк каждой школе, и возможно ли это вообще?

Комментарии:

1. На самом деле я использую поиск и замену eclipse. Однако мой окончательный код будет выполняться на сервере ColdFusion.

2. Что вы делаете с найденным значением? Переход к функции? Сохранение в БД? Уничтожать его?

Ответ №1:

Ну, я бы не стал делать этого в Eclipse, если вы можете этого избежать. Если у вас есть доступ к командной строке, вот строка perl-one, которую вы можете использовать:

 perl -lanF"t" -e $'print "else if (" . join(" OR ", map {"school IS '$_'"} @F) . ")"' input_file
  

Для простоты эта команда выводит «else if» для всех строк, включая первую. Вам придется изменить первую строку вручную.

Кстати, вы указали, что ваши входные данные представляют собой CSV-файл (значения, разделенные запятыми), но, похоже, на самом деле это файл с разделителями табуляции. Мое решение работает только с файлом, разделенным табуляцией, в качестве входных данных.

Комментарии:

1. Прошу прощения, на самом деле это файл с разделителями табуляции.

Ответ №2:

Я не уверен, что вы хотите сделать со своим регулярным выражением.

Я бы сделал это, поскольку это одноразовая работа, с заменой поиска в три этапа. Я не знаю, на что способен eclipse, но is также должен уметь это делать.

  1. Шаг: Вставьте в каждое начало строки «else, если(школа ‘». Для первой строки сделайте это вручную.

  2. Шаг: Замените » » (5 пробелов, как в вашем примере выше) на «‘ ИЛИ школа — ЭТО ‘»

  3. Шаг: Вставить в конце каждой строки «‘)»

Ответ №3:

Не совсем уверен, что вы пытаетесь сделать … вы ищете код для создания гигантского блока if для вас? Если да, то вот некоторый (поддельный) код, основанный на Java:

 Pattern p = "([a-z-A-Zs.] )"; // School names - adjust the pattern as neeeded
String ifBlock;
for (i = 0; i < data.lineCount; i  )                  // Lines in a file
  String schools = '';
  while (p.find())                                    // School name in a line
    schools  = "school IS "   match   " OR ";
  end
  if (school.length > 0)
    school = school.substring(0, school.length - 3);  // trim the trailing 'OR'
  ifBlock  = "else if("   school   ") { n <<EXECUTION CODE>> n }"; // add to block
end
if (ifBlock.length > 0)
  ifBlock = ifBlock.substring(5);                     //Remove leading 'else'
  

Комментарии:

1. Не уверен, что здесь изменил Bart… В любом случае, я собирался сказать, что я также предпочитаю метод построения Set для каждой строки, затем используя if (theSet.contains(theItem)) EDIT: неважно, теперь я вижу. Спасибо, Барт!