2017-02-12 11 views
1

Я боролся с этим в течение последних нескольких дней. Я прошу прощения, если это дубликат, я не смог найти то, что мне нужно, при поиске этого конкретного вопроса.Regex для замены имен классов на всей кодовой базе в редакторе Atom

У меня есть имена классов, как следующее:

class="block underline primary"

className="text-center block primary-dark"

class="grey bg-black inline-block block"

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

  1. Убедитесь, что строка содержится в class="" или className=""
  2. Убедитесь, что это только соответствие точное слово, так что в приведенном выше него будет соответствовать только block и не inline-block, если это то, что Я искал.

я в настоящее время это, которое почти делает то, что мне нужно, но не приходится className или class и будет возвращать пункты или вещи, не содержащиеся в классе, который я не хочу:

(\s(block)\s)|(="(block)\s)|(\s(block)")

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

редактировать

мне также нужно учитывать имена классов, как следующее:

class="block block-title blockDisabled"

Таким образом, в конце концов, я только хочу, чтобы предназначаться block и ничего другого.

ответ

1

Вы можете использовать следующее выражение:

(className|class)="(?:block|block\s([^"]*)|([^"]*)\sblock|([^"]*)\sblock(?=\s)([^"]*))" 

Live Example Here

Оттуда, если вы хотите, чтобы удалить block класс, вы должны использовать $1="$2$3$4$5" для замены.

Однако, если вы хотите заменить block класс, как ваше название подразумевает, то вы должны использовать $1="$2$3$4$5 replacement-class" для замены (где строка «замена класс» является классом вы заменить block класс с).

Объяснение:

  • (className|class) - Захват имя атрибута
  • =" - Матч открытия значения атрибута
    • (?: - начало, не захватывая группы
      • block - Матч строку block
      • | - или ...
      • block\s([^"]*) - Захват классов после строки block
      • | - или ...
      • ([^"]*)\sblock - Захват классов перед строкой block
      • | - или ...
      • ([^"]*)\sblock(?=\s)([^"]*) - Захват классов вокруг строки block
    • ) - Конец без захвата группы
  • " - Сопоставьте закрытие значения атрибута
+0

Спасибо за быстрый ответ! К сожалению, я должен был упомянуть, что такие имена классов, как 'block-title' или' blockOverlay', могут быть включены, что я не хочу настраивать таргетинг, см. Здесь: https://regex101.com/r/xICKkv/1 Мне бы хотелось просто заменить экземпляры «блока» ничем, окружающим его. Это возможно? – souporserious

+0

@ftntravis - Кажется, я понял ... Я добавил объяснение; здесь [обновленный пример] (https://regex101.com/r/fFBTRU/1) ... –

+1

Большое вам спасибо! Кажется, это работает отлично. Я очень ценю помощь. Это сэкономит столько времени! : D – souporserious