2016-06-17 2 views
-1

у меня есть этот текстКак заменить это выражение в цепочном регулярном выражении (notepad ++)?

14 два 25 три 12 четыре 40 пять 10

Я хочу, чтобы получить "14 два 14 25 три 14 25 12 четыре 14 25 12 40 пяти 14 25 12 40 10"

Например, когда я заменяю (14 два) на (14 два 14) этот старт после 14, я не могу запустить его после двух.

Есть ли другая альтернатива? Например, используя группу, которая не включена в соответствие (группа перед матчем) для ее замены?

пожалуйста, помогите мне

ответ

0

Это должно сделать трюк для вас:

Regex: ((?:\s?\d+\s?)+)((?:[a-zA-Z](?![^a-zA-Z]+\1))+)

Замена: $1$2 $1

Вам нужно будет нажать на "замените все кнопки ", чтобы это работало (это не может быть d один за один выстрел он должен быть повторен, пока он может найти совпадение. Online PHP example)

enter image description here

Объяснение:

  • \s: матч единый символ пробела
  • ?: предыдущее выражение должно быть согласовано 0 или 1 раз.
  • \s?: Сопоставьте символ пробела 0 или 1 раз.
  • \d: Соответствует символу цифры (эквивалент [0-9]).
  • +: Предыдущее выражение должно быть сопоставлено хотя бы один раз (u до бесконечности).
  • \d+: Сопоставьте столько символов цифр, сколько вы (но хотя бы один раз).
  • (): Захват группы
  • (?:): Non-захвата группы
  • ((?:\s?\d+\s?)+): матч дополнительный символ пробела следует один или более цифровых символов, с последующим дополнительным пробелом. Выражение окружено группой без захвата, за которой следует плюс. Это означает, что регулярное выражение будет пытаться сопоставить столько сочетаний пространства и цифры, сколько может (так что вы можете получить что-то вроде «14 25 12 40»).

Группа захвата предназначена для того, чтобы сохранить значение, чтобы повторно использовать его взамен. Вы не можете просто добавить плюс в конце группы захвата без группы, не содержащей захвата, потому что она будет помнить только последние цифры захват ('12' вместо всего '14 25 12 'используется для сборки '14 25 12 40').

  • [a-zA-Z]: Соответствует любым английским буквам в любом случае (нижний, верхний).
  • \1: ссылка на то, что было захватом в первой группе.
  • (?!): Отрицательный взгляд.
  • [^]: Отрицательный класс символов, так [^a-zA-Z] означает соответствие ничего
  • ((?:[a-zA-Z](?![^a-zA-Z]+\1))+): Отрицательная опережения предназначен, чтобы убедиться, что мы не всегда в конечном итоге соответствие первым «14 два» во входном тексте. Без этого мы закончили бы бесконечным циклом, дающим результаты как «14 два 14 14 14 14 14 14 25 три 12 четыре 40 пять 10» («14» до «25» повторяются до тех пор, пока вы не достигнете таймаута).

В принципе, для каждой английской буквы, которую мы сопоставляем, мы хотим сказать, что содержание первой группы захвата (на примере «14») отсутствует в нашей цифровой последовательности.

Для замены $1$2 $1 означает размещение содержимого группы захвата 1 и 2, добавление пробела и добавление содержимого группы захвата 1 еще раз.

Успех и, если он соответствует вашим ожиданиям, не забудьте принять мой ответ.