RegEx: Как я могу заменить $ n экземпляров строки? - PullRequest
1 голос
/ 19 июня 2010

Я пытаюсь заменить числа в форме 4.2098234e-3 на 00042098234. Я могу захватить составные части в порядке с:

(-?)(\d+).(\d)+e-($d+)

но я не знаю, как это сделать, это повторить нули в начале $4 раз.

Есть идеи?

Заранее спасибо, Росс

В идеале, я бы хотел сделать это с помощью функции поиска / замены в TextMate, если это имеет какое-либо значение. Я ценю, что есть инструменты лучше, чем RegEx для этой проблемы, но это все еще интересный вопрос (для меня).

Ответы [ 2 ]

3 голосов
/ 19 июня 2010

Вы не можете сделать это чисто в регулярных выражениях, потому что строка замены - это просто строка с обратными ссылками - вы не можете использовать повторение там.

В большинстве языков программирования вы можете заменить регулярное выражение на обратный вызов, который сможет это сделать. Однако это не то, что текстовый редактор может сделать (если у него нет поддержки сценариев).

1 голос
/ 20 июня 2010

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

Вот иллюстративный пример замены цифры [0-9] с таким количеством нулей.

    // generate the regex and the replacement strings
    String seq = "123456789";
    String regex = seq.replaceAll(".", "(?=[$0-9].*(0)\\$)?") + "\\d";
    String repl = seq.replaceAll(".", "\\$$0");

    // let's see what they look like!!!
    System.out.println(repl); // prints "$1$2$3$4$5$6$7$8$9"
    System.out.println(regex); // prints oh my god just look at the next section!

    // let's see if they work...
    String input = "3 2 0 4 x 11 9";
    System.out.println(
        (input + "0").replaceAll(regex, repl)
    ); // prints "000 00  0000 x 00 000000000"

    // it works!!!

Регулярное выражение (, как видно на ideone.com ) (слегка отформатировано для удобства чтения):

(?=[1-9].*(0)$)?
(?=[2-9].*(0)$)?
(?=[3-9].*(0)$)?
(?=[4-9].*(0)$)?
(?=[5-9].*(0)$)?
(?=[6-9].*(0)$)?
(?=[7-9].*(0)$)?
(?=[8-9].*(0)$)?
(?=[9-9].*(0)$)?
\d

Но как это работает ??

Регулярное выражение опирается на позитивных взглядов .Он соответствует \d, но перед тем, как сделать это, он пытается определить, является ли он [1-9].Если это так, \1 проходит до конца ввода, где добавлен 0, чтобы захватить этот 0.Затем второе утверждение проверяет, является ли оно [2-9], и если да, то \2 проходит до конца ввода, чтобы захватить 0 и т. Д.

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

Обратите внимание, что 11 заменено на 00.То есть каждый 1 заменяется на 1 ноль.Вероятно, можно узнать число 11 и поставить вместо него 11 нулей, но это только сделает регулярное выражение более запутанным.

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