Regex, чтобы найти пробелы в именах якорей? - PullRequest
0 голосов
/ 30 ноября 2018

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

Например, в теге

<a id="Subsection Two Test One Two Three" name="Subsection Two Test One Two Three">

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

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы можете использовать следующее регулярное выражение для замены пробелов пустой строкой (ваш движок регулярных выражений должен поддерживать look behind и look ahead):

/(?<!\<a)(?<=\w)\s(?=\w)/g

Регулярное выражение начинается с создания negative look behind для: '<a'.

Затем он получает положительное значение look behind для Word character, затем соответствует White space и, наконец, looks ahead для Word символа.

Теперьreplace совпадений с empty string.

0 голосов
/ 30 ноября 2018

Вы должны использовать регулярное выражение, которое знает, как сопоставлять теги.

Процедура:

Сделать 2 заменить все проходы на источнике.Вам понадобится обратный вызов, чтобы заменить пробелы подчеркиванием.


Будет объяснен первый, ID , NAME - второй проход (процедура та же).

<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sid\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>

является заменить dall регулярное выражение для ID

Объяснено

 # Begin Anchor tag

 < a                 
 (?= \s )
 (?=                           # Asserttion (a pseudo atomic group)
      (                             # (1 start), Up to ID attribute
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           \s id \s* = \s* 
      )                             # (1 end)
      (?:
           ( ['"] )                      # (2), Quote
           ( [\S\s]*? )                  # (3), ID Value
           \2 
      )
      (                             # (4 start), After ID attribute
           (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )*?
           >
      )                             # (4 end)
 )

 # Have the ID, just match the rest of tag

 \s+ 
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+

 >                             # End Anchor tag

Внутри обратного вызова группы будут объединены, чтобы сформировать замену
следующим образом.

// сохранить захваченные группы
$ g1 = match.groups [1];
$ g2 = match.groups [2];
$ g3 = match.groups [3];
$ g4 = match.groups [4];

// создаем строку возврата из сохраненных групп захвата

return "<a" + $g1$g2 +
replaceAll($g3, " ", "_") + // здесь есть функция глобальной замены регулярного выражения
$g2$g4;

Легенда:
группа 1 = до атрибута идентификатора
группа 2 = разделитель значения
группа 3 = значение идентификатора
группа 4 = атрибут после идентификатора


Атрибут Name такой же для обратного вызова, используйте это регулярное выражение для , замените все .

<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sname\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>

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