#javascript #regex
#javascript #регулярное выражение
Вопрос:
Мне нужно заменить =
to ==
с помощью JavaScript при условии, что он не должен заменять if уже как
==
>=
<=
=>
=<
Кто-нибудь может помочь мне в этом с объяснением. Я пытаюсь, как показано ниже, но это заменяло все.
text = text.replace(/=/, "==");
Ввод :
Premium UserId=5||Premium UserId>=2
Необходимый результат:
Premium UserId==5||Premium UserId>=2
Комментарии:
1. Это больше похоже на работу парсера / токенизатора. Является ли заменяемый текст формальным языком, таким как JavaScript?
Ответ №1:
Используйте следующее регулярное выражение:
var str = 'Premium UserId=5||Premium = UserId>=2',
re = /([^=><])=([^=><]*?)/g;
console.log(str.replace(re, "$1==$2"));
Ответ №2:
Вы должны использовать эту возможность, чтобы узнать о поиске регулярных выражений. К сожалению, хотя JavaScript поддерживает lookahead, он не поддерживает lookbehind. Поэтому, хотя регулярное /=(?![>=<])/
выражение успешно избегает следующих совпадений: =<
и =>
, оно все равно будет соответствовать всему остальному.
Однако есть способы имитировать поиск в Javascript. Вы можете использовать следующий фрагмент кода для достижения того, что вы пытаетесь сделать:
var text = 'Premium UserId=5||Premium UserId>=2';
text = text.replace(/([>=<])?=(?![>=<])/g, function($0, $1) {
return $1 ? $0 : $0 '=';
});
console.log(text)
Ответ №3:
может быть, что-то вроде этого? (не будет соответствовать самому началу или концу текста …)
text=text.replace(/([^=><])=([^=><])/g, function (match,p1,p2){ return p1 "==" p2; });
var text = "Premium UserId=5||Premium UserId>=2";
text=text.replace(/([^=><])=([^=><])/g, function (match,p1,p2){ return p1 "==" p2; });
console.log(text)
Ответ №4:
Попробуйте этот подход
var input = "Premium UserId=5||Premium UserId>=2";
var regex = new RegExp( "(?:[0-9a-zs])=(?![<>])", "gi" );
var output = input.replace( regex , function(match){ return match.charAt(0) "==" } );
console.log(output);
console.log("Premium UserId =5||Premium UserId>=2".replace( /(?:[0-9a-zs])=(?![<>])/gi, function(match){ return match.charAt(0) "==" } ));
console.log("Premium UserId =>5||Premium UserId>=2".replace( /(?:[0-9a-zs])=(?![<>])/gi, function(match){ return match.charAt(0) "==" } ));
Комментарии:
1. Я не понизил голос, но это предполагает, что непосредственно перед оператором есть слово (которое также может быть, но оно не указано в вопросе). Не будет работать, если строка имеет значение «Premium userId = 5».
2. На самом деле это неправильно работает для
=>
и=<
.
Ответ №5:
var re = /(([^<>=])(={1,1})([^<>=]))/g
var tests = [
{in: 'Premium UserId=5||Premium UserId>=2', out: 'Premium UserId==5||Premium UserId>=2'},
{in: 'if (UserId == 5)', out: 'if (UserId == 5)'}
]
tests.forEach(function(test, idx){
var result = test.in.replace(re, '$2==$4') === test.out
console.log('test', idx, result)
})