Reg Ex Добавить пробел между алфавитом и цифрой в строке - PullRequest
0 голосов
/ 14 ноября 2010

Привет, у меня есть такие строки, и я хочу получить Like toto100, чтобы стать toto 100. Спасибо за вашу помощь

Ответы [ 3 ]

3 голосов
/ 14 ноября 2010

Найдите

(?<=[a-zA-Z])(?=[0-9])

и замените его пробелом.Если вы также хотите разделить 100toto, используйте

(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])

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

Как подсказывает tchrist, конечно, лучшене ограничивать себя буквами и цифрами ASCII, особенно если используемый вами язык поддерживает Юникод в регулярных выражениях (как это делает Java).

Так что второе регулярное выражение выглядит как

(?<=\p{L])(?=\p{N})|(?<=\p{N})(?=\p{L})

В Java:

String result = subject.replaceAll("(?<=\\p{L])(?=\\p{N})|(?<=\\p{N})(?=\\p{L})", " ");
1 голос
/ 14 ноября 2010

Заимствуя решение Тима, но исправив его для обработки ASCII более 1970-х годов - помните, символы Java являются Unicode, поэтому вы должны учитывать это - дает следующее простое решение:

String new = old.replaceAll("(?x) (?<= \\pL ) (?= \\pN ) | (?<= \\pN ) (?= \\pL )", " ");

и это более поддерживаемоеи менее безумная версия:

String new = old.replaceAll(
                "(?x)           # enable comment mode         \n"

              + " # LOOK FOR EITHER:                          \n"

              + "  (?<= \\pL )  #     a letter right behind   \n"
              + "  (?=  \\pN )  # AND a number right ahead    \n"

              + " |             #   OR ELSE                   \n"

              + "  (?<=  \\pN ) #     a number right behind   \n"
              + "  (?=   \\pL ) # AND a letter right ahead    \n"

              + "",             // placeholder so comma doesn't get lost

                " ");           // replaced with a single space

, которую, я думаю, вы могли бы написать так, чтобы не было слишком отступов:

String new = old.replaceAll(
    "(?x)           # enable comment mode         \n"

  + "               # LOOK FOR EITHER:            \n"

  + "  (?<= \\pL )  #     a letter right behind   \n"
  + "  (?=  \\pN )  # AND a number right ahead    \n"

  + " |             #   OR ELSE                   \n"

  + "  (?<= \\pN )  #     a number right behind   \n"
  + "  (?=  \\pL )  # AND a letter right ahead    \n"

  + "",             // placeholder so comma doesn't get lost

  " ");             // replaced with a single space

Это, вероятно, лучшее, что вы сможете сделатьделать, учитывая, как ужасно плохо подходит Java для такого рода работы.Если вы использовали только Java, вы, вероятно, даже не знаете, насколько это на самом деле противно.Здесь для сравнения показано, как выглядит та же самая операция на языке, который был разработан с учетом регулярных выражений:

($new = $old) =~ s{  # LOOK FOR EITHER:
    (?<= \pL )       #      a letter right behind
    (?=  \pN )       #  AND a number right ahead
  |                  # OR ELSE:    
    (?<= \pN )       #      a number right behind
    (?=  \pL )       #  AND a letter right ahead
}{ }xg;              # THEN insert a single space

См. Все многие, многие критически важныеразличия?Просто ошеломляет, не так ли?

Я могу выполнять регулярные выражения в ассемблере, если я тоже хочу;на самом деле у меня есть.Это так же весело, как и на Java.Выполнение регулярных выражений в Java слишком похоже на обучение свиньи пению: это пустая трата вашего времени, и это раздражает свинью;это также раздражает всех остальных, включая вас.

Обучение правильному инструменту для правильной задачи - это то, что отличает профессионального программиста от обезьяны кода.Жизнь слишком коротка, чтобы биться головой о кирпичную стену.

0 голосов
/ 14 ноября 2010

Так как вы не указали язык, вот один с Ruby:

ruby-1.9.2-p0 > "toto123".gsub(/([a-z]+)(\d+)/i, '\1 \2')
 => "toto 123"

Но на другом языке это очень похоже.

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