2010-06-21 4 views
0

Я пытаюсь исправить файл, полный 1- и 2-значных чисел, чтобы сделать их все 2 цифры длинными.

Файл формы:

10,5,2 
2,4,5 
7,7,12 
... 

мне удалось соответствовать проблемные номера с:

(^|,)(\d)(,|$) 

Все, что я хочу сделать сейчас, это заменить строку обижая с:

${1}0$2$3 

но TextMate дает мне:

10${1}05,2 

Любые идеи?

Спасибо заранее, Росс

ответ

6

В соответствии с this, TextMate поддерживает якорные граничные якоря, поэтому вы также можете найти \b\d\b и заменить все на 0$0. (Спасибо Peter Boughton за это предложение!)

Это преимущество состоит в том, что вы забираете все номера за один раз - ваше решение придется применять не реже двух раз, потому что двигатель регулярного выражения уже потреблял запятую перед следующим номером после успешной замены.

+0

+1 для ответа на добавленную стоимость! – Amarghosh

+0

Согласно этой ссылке поддерживается $ 0, поэтому вы можете упростить регулярное выражение до '\ b \ d \ b' и использовать 0 $ 0 в результате. –

+0

Еще лучше :) Служит мне правильно, не читая его более тщательно. Отредактировал мой ответ. –

0

Вам не нужно ${1} - заменить строки поддерживают только до девяти групп, максимум - так что это не будет ошибкой его $10.

Заменить $10$2$3

+0

+1, тоже :) –

+0

Когда я пытаюсь это, я считаю, что $ 10 заменяется ничего, так: 25,9, становится: 259, –

+0

@rossmcf Это нормальное поведение замены с регулярными выражениями. У меня нет textmate, но если вы правы, это может быть ошибкой в ​​нем. – Amarghosh

2

Примечание: Решение Тима проще и решает эту проблему, но я оставлю это здесь для справки, в случае, если кто-то аналогичное, но более сложную проблему, которая с помощью lookarounds может поддерживать ,


Более простой способ, чем ваше выражение является замена:

(?<!\d)\d(?!\d) 

С:

0$0 

который "заменить все одиночные цифры с 0, то само по себе".

регулярное выражение:
Отрицательный просмотра назад не найти цифру (?<!\d)
одноразрядные: \d
Отрицательных опережения не найти цифру (?!\d)

Однофазного это позиционная матч (не совпадение символов), он обслуживает как запятую, так и начальную/конечную позиции.

В разделе $0 говорится, что «весь матч» - с позиций соответствия lookbe/впереди, это будет содержать единственную цифру, которая была сопоставлена.

+0

Спасибо. Должен играть с lookbehind/ahead. Я regex n00b. –

2

Для всех, кто придет сюда, как @Amarghosh suggested, это ошибка или преднамеренное поведение, которое приводит к проблемам, если ничего другого.

У меня была эта проблема, и мне пришлось использовать следующее обходное решение: если вы настроили еще одну группу захвата и затем используете условную вставку, она будет работать. Например, у меня была строка, такая как <WebObject name=Frage01, и мне хотелось заменить 01 на 02, поэтому я взял основную строку в $1 и номер конца в $2, что дало мне регулярное выражение, которое выглядело как (<WebObject name=(Frage|Antwort))(01).

Тогда замена была $1(?2:02).

(?2:02) - условная вставка, и в этом случае всегда найдется что-то, но это необходимо для того, чтобы обойти нечетную головоломку добавления номера в конец $n. Надежда помогает кому-то. Имеется документация по условной установке here

+0

Теперь * есть * хорошая особенность! –

+0

Я смог использовать ваше обходное решение, чтобы поместить номер после замены.В моем случае у меня не было ничего, что можно было бы использовать для условной вставки, поэтому я только что сделал группу захвата, которую я знал, не совпадал бы с любыми символами и не вставил условно ничего: '^ (. *) (π?) $ 'заменяется на' $ 1 (? 2:) 0' –

1

В TextMate 1.5.11 (1635) ${1} не работает (как описано в ОП).

Я ценю много предложений, изменяющих строку запроса, однако есть гораздо более простое решение, если вы хотите разбить группу захвата и число: \u.

Это синтаксис замены TextMate, который преобразует следующий символ в верхний регистр. Поскольку для чисел нет прописных букв, он ничего не делает и движется дальше. Он описан в the link from Tim Pietzcker's answer.

В моем случае мне пришлось очистить файл csv, где размеры коробки были указаны в см х см х мм. Таким образом, я должен был добавить нуль к первым двум числам.

Text: "80 x 40 x 5 mm" 
Desired text: "800 x 400 x 5 mm" 

Find: (\d+) x (\d+) x (\d+) 
Replace: $1\u0 x $2\u0 x $3 mm 

Что касается поддержки более чем 10 групп захвата, я не знаю, если это ошибка. Но, как писали OP и @rossmcf, $10 заменен на null.

Смежные вопросы