2015-04-08 1 views
0

Я пытаюсь около 2 часов, и я не уверен, что я хочу делать, даже работает.Замените пространство точкой с запятой, когда более одного с регулярным выражением

У меня есть большой файл с некоторыми данными, который выглядит как

43034452  LONGSHIRTPAIETTE          17.30 
       27.90          
              0110    


      COLOR    :     :     :     :     : 
       :     :     :      
      -11  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
43034453  LONG SHIRT PAI ETTE            16.40 
       25.90          
              0110    


      COLOR    :     :     :     :     : 
       :     :     :      
       -3  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
43034454  BASIC              4.99 
       8.90          
              0110    


      COLOR    :     :     :     :     : 
       :     :     :      
       -5  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 

(Файл имеет 36K строк.)

То, что я хочу сделать, это получить все это дело в чистоте.

В конце концов, строки должны выглядеть

43034452;LONGSHIRTPAIETTE;17.30;27.90;0110 
43034453;LONG SHIRT PAI ETTE;16.40;25.90;0110 
43034454;BASIC;4.99;8.90;0110 

Так что есть много данных, которые мне не нужны. Я использую Notepad ++ для выполнения своего регулярного выражения.

Моя строка регулярных выражений выглядит как ([0-9]*)\s{6,}([A-Z]*)\s*([0-9\.]*)\s*([0-9\.]*)\s*([0-9]*) на данный момент.

Это приносит мне первое число, за которым следуют 6 пробелов. (Это должно быть так, потому что некоторые строки начинаются с FF и FF не буквы. Это какой-то знак, что я не могу определить, но если я позволю Notepad ++ показать все признаки, которые я вижу FF.)

Так как В результате я получаю

как ожидалось, но в следующем ряду он останавливается на пространстве. Если я добавлю \s к шаблону, он также будет выбирать все пробелы после слова. И я, очевидно, не могу сказать «только одно пространство», не так ли?

Так что мой вопрос: могу ли я использовать регулярное выражение, чтобы получить выбор, как тот, который я хочу?

Если да, то что я делаю неправильно?

ответ

1

Попробуйте это:

([0-9]+)\s{6,}((?:[A-Z]+\)+)\s*([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+) 

Примечания нескольких вещей:

  • Затягивание * с до +, где это уместно, так что вы соблюдение некоторых символов в тех столбцы или фактические пробелы
  • Использование non-capturing group повторить один или несколько экземпляров слово, затем пробел.
+0

gues. Я пойду с этим, потому что в этом случае у меня есть только одно место в конце последнего слова. :) – Dwza

+0

Есть ли возможность также искать запятую в слове? Потому что у меня есть слово вроде: 'foo ,, bar', и запятая может остаться, как они ... – Dwza

+0

@Dwza - конечно, просто добавьте его в символы, то есть используйте' [AZ,] + ' – declension

1

Используйте приведенные ниже REGEX

([0-9]*)\s{6,}([A-Z]+(?:\s+[A-Z]+)*)\s*([0-9\.]*)\s*([0-9\.]*)\s*([0-9]*).*?(?=\n\S|$) 

, а затем заменить матч с \1;\2;\3;\4;\5

Не забудьте включить DOTALL модификатор s.

DEMO

+0

Этот шаблон также соответствует строке с цветом. На самом деле его приятно, потому что thr пробелы после последнего слова сокращены, но есть много строк, выбранных – Dwza

+0

, но он дает вам ожидаемый результат. –

+0

Поскольку выбрано больше строк, то я хочу ... чем нет :), потому что, если я заменю данные, давайте скажем semikolon, чем я изменяю данные, «которые мне не нужны», и это делает другой задачей выбрать это и удалить это :) Итак, это Да и Нет. Вот почему я дал вам 1 + – Dwza

1

Ваш подход правильный. Просто замените * на + (более одного) в вашем регулярном выражении.

/([0-9]+)\s{6,}([A-Z ]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)/g 

См. DEMO.

+0

это похоже на работу в Интернете, но не в блокноте ++, если я использую его, он пропускает много строк, чем suttenly занимает 2 строки и пропускает еще несколько строк ... – Dwza

+0

, пожалуйста, проверьте обновлено regex .. Я пропустил пробел в '([AZ] +)' –

+0

На самом деле нормально, но пробелы в конце последнего слова не обрезаны. – Dwza