Regex заменить между 2 словами и изменить результат - PullRequest
0 голосов
/ 13 января 2020

У меня есть пример строки:

var s = 'type=audio&hls=&mp3=foo';

Я хотел бы найти все между = и & и заменить на кавычки + соответствующее значение, чтобы я получил это:

type="audio" hls="" mp3="foo" 

( совпадение в кавычках, даже если оно пустое и & заменяется пробелом)

Это мое регулярное выражение, но оно не работает:

s = s.replace(/=.+?\\&/g,function(a,inside){
        return '="'+inside+'" ';
})

1 Ответ

0 голосов
/ 13 января 2020

Если мы рассмотрим ваше регулярное выражение по одному токену за раз, вот что это значит:

=    matches a literal equal sign
.+?  matches an optional string that has at least one character in it
\\   matches a literal backslash
&    matches a literal ampersand

Среди других проблем, это требует, чтобы литеральная обратная косая черта sh была во входной строке, и требует строка заканчивается амперсандом. Также .+? может быть сокращено до .*, но все равно неправильно, поскольку оно может включать амперсанды и знаки равенства в совпадающей строке.

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

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

=       matches a literal equal sign
[^&]*   matches a string (possibly empty) that does not contain ampersands
&?      matches an optional ampersand

Как указывал Wiktor выше, все это можно объединить, как это :

 s = s.replace(/=([^&]*)&?/g, '="$1" ').trim();

Здесь круглые скобки используются для обозначения части сопоставляемого шаблона, который заменяется, $1 используется для обозначения отмеченной части рисунка в скобках, а .trim() удаляет завершающий пробел.

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