Регулярное выражение Javascript для замены «=» на «==» без наличия какого-либо специального символа, имеющего его

#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)
})