замяніць усе без рэгулярных выразаў, дзе я магу выкарыстоўваць G

Таму ў мяне ёсць наступныя:

var token = '[token]';
var tokenValue = 'elephant';
var string = 'i have a beautiful [token] and i sold my [token]';
string = string.replace(token, tokenValue);

Вышэй будзе толькі замяніць першы [лексема] і пакінуць другі на адзін.

Калі б я выкарыстаць рэгулярны выраз, я мог бы выкарыстаць яго як

string = string.replace(/[token]/g, tokenValue);

And this would replace all my [tokens]

Аднак я не ведаю, як зрабіць гэта без выкарыстання //

5
// выкарыстоўваецца ў рэгулярных выразах для вызначэння абмежавальнікаў. Калі ёсць спосаб, каб дадаць г або «ўсё», каб замяніць без яго, што гэта шлях?
дададзена аўтар Neta Meta, крыніца
Прычына я не магу выкарыстоўваць яго адказ: jsfiddle.net/U43uM/1
дададзена аўтар Neta Meta, крыніца
чаму // розніца?
дададзена аўтар Cfreak, крыніца
Правільная тэрміналогія для навакольных што-небудзь з // з'яўляецца тое, што ён робіць рэгулярны выраз літаральна. Адзіныя шляхамі я ведаю для вядзення замяніць усе без рэгулярных выразаў літаральнага (або бібліятэк трэцяга боку) з'яўляецца выкарыстанне RegExp канструктар аб'екта (які да гэтага часу выкарыстоўвае рэгулярны выраз, см Айзек адказу), або зрабіць старанна сканструяваны цыкл, які будзе шукаць ўваходжання вашага лексемы у радку і замяніць яго tokenValue , пакуль не ўваходжання лексемы не знойдзены , Я прапаную Айзека адказ, калі вы ўсё яшчэ можаце выкарыстоўваць рэгулярныя выразы (не ўпэўнены, чаму вы б не было ...).
дададзена аўтар ajp15243, крыніца

12 адказы

Я знайшоў раскол/далучыцца да досыць здавальняючым для большасці маіх спраў. Прыклад з рэальнага жыцця:

myText.split("\n").join('
');
8
дададзена

Чаму б не замяніць токен кожны раз, калі ён з'яўляецца з рабіць падчас цыкла?

var index = 0;
do {
    string = string.replace(token, tokenValue);
} while((index = string.indexOf(token, index + 1)) > -1);
7
дададзена
Ваш, здаецца, што я шукаю, аднак аленевую скуру IndexOf мае некаторы браўзэр несумяшчальнасць?
дададзена аўтар Neta Meta, крыніца
Вы б праблемы ў больш старых версіях IE, калі вы выкарыстоўвалі String.indexOf падтрымліваецца, так што вы не павінны мець ніякіх праблем з яго радкамі.
дададзена аўтар ajp15243, крыніца
гэта не будзе працаваць: вар strinSample = 'CIC'; Індэкс вар = 0; рабіць {strinSample = strinSample.replace ( 'C', 'CC'); } У той час як ((індэкс = strinSample.indexOf ( 'C', індэкс + 1))> -1);
дададзена аўтар Devid, крыніца
Я неўпэўнены...
дададзена аўтар TheBestGuest, крыніца

Чаму б не замяніць токен кожны раз, калі ён з'яўляецца з рабіць падчас цыкла?

var index = 0;
do {
    string = string.replace(token, tokenValue);
} while((index = string.indexOf(token, index + 1)) > -1);
7
дададзена
Ваш, здаецца, што я шукаю, аднак аленевую скуру IndexOf мае некаторы браўзэр несумяшчальнасць?
дададзена аўтар Neta Meta, крыніца
Вы б праблемы ў больш старых версіях IE, калі вы выкарыстоўвалі String.indexOf падтрымліваецца, так што вы не павінны мець ніякіх праблем з яго радкамі.
дададзена аўтар ajp15243, крыніца
гэта не будзе працаваць: вар strinSample = 'CIC'; Індэкс вар = 0; рабіць {strinSample = strinSample.replace ( 'C', 'CC'); } У той час як ((індэкс = strinSample.indexOf ( 'C', індэкс + 1))> -1);
дададзена аўтар Devid, крыніца
Я неўпэўнены...
дададзена аўтар TheBestGuest, крыніца
string = string.replace(new RegExp("\\[token\\]","g"), tokenValue);
3
дададзена
Вы выпускаеце я не змог уцячы або змяніць значэнне зменных лексем Дзякуй за вашу дапамогу, хоць
дададзена аўтар Neta Meta, крыніца
Не, не можа, і нават калі я іх пазбегнуць ёсць яшчэ пытанне.
дададзена аўтар Neta Meta, крыніца
Айзек ваш адказ добры, але не вырашае маю праблему і «[]" не замяняецца - і я не змог пазбегла «[]».
дададзена аўтар Neta Meta, крыніца
@NetaMeta Зараз гэта мае сэнс, вам трэба бегчы [] , але не можа змяніць зыходнае значэнне лексемы радкі рэгулярных выразаў. Вы можаце выкарыстоўваць адказы тут або here замяніць сімвалы ў маркер радок з іх эквівалентным рэгулярным выразам метасімвалы. Затым вы можаце выкарыстоўваць маркер як рэгулярны выраз, дзе вы калі ласка. Звярніце ўвагу, што гэта будзе дрэнным рашэннем, калі карыстальнік ўводзіць рэгулярны выраз, так як яны маглі б у чымсьці накшталт [.
дададзена аўтар ajp15243, крыніца
Праз нейкі дробязны, і, гледзячы на ​​ stackoverflow.com/questions/6863050/… Я зразумеў, як пазбегнуць []
дададзена аўтар Isaac, крыніца
Вы не можаце зрабіць \ [лексема \] ?
дададзена аўтар Isaac, крыніца

Я зразумеў, што адказ ад @TheBestGuest не будзе працаваць адбываецца некарэктна, напрыклад, як вы будзеце ў канчатковым выніку ў бясконцым цыкле:

var stringSample= 'CIC'; 
var index = 0; 
do { stringSample = stringSample.replace('C', 'CC'); } 
while((index = stringSample.indexOf('C', index + 1)) > -1);

Дык вось мая прапанова для метаду replaceAll напісаным ў машынапісным:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="true"> <div class="snippet-code">

let matchString = 'CIC';
let searchValueString= 'C';
let replacementString ='CC';
    
matchString = matchString.split(searchValueString).join(replacementString);
     console.log(matchString);
</div> </div>
1
дададзена
"[.token.*] nonsense and [.token.*] more nonsense".replace("[.token.*]", "some", "g");

Будзе вырабляць:

«Якую-небудзь глупства, і яшчэ нейкі трызненне»

1
дададзена
Звярніце ўвагу, што гэта працуе толькі на Firefox </а>
дададзена аўтар William Barbosa, крыніца
"[.token.*] nonsense and [.token.*] more nonsense".replace("[.token.*]", "some", "g");

Будзе вырабляць:

«Якую-небудзь глупства, і яшчэ нейкі трызненне»

1
дададзена
Звярніце ўвагу, што гэта працуе толькі на Firefox </а>
дададзена аўтар William Barbosa, крыніца
"[.token.*] nonsense and [.token.*] more nonsense".replace("[.token.*]", "some", "g");

Будзе вырабляць:

«Якую-небудзь глупства, і яшчэ нейкі трызненне»

1
дададзена
Звярніце ўвагу, што гэта працуе толькі на Firefox </а>
дададзена аўтар William Barbosa, крыніца

Асцярожна з прынятым адказам, радок ReplaceWith можа ўтрымліваць радок inToReplace, і ў гэтым выпадку будзе бясконцы цыкл ...

Тут лепшы варыянт:

function replaceSubstring(inSource, inToReplace, inReplaceWith)
{
    var outString = [];
    var repLen = inToReplace.length;

    while (true)
    {
        var idx = inSource.indexOf(inToReplace);
        if (idx == -1)
        {
            outString.push(inSource);
            break;
        }

        outString.push(inSource.substring(0, idx))
        outString.push(inReplaceWith);

        inSource = inSource.substring(idx + repLen);
    }

    return outString.join("");
}
0
дададзена
У выпадку, калі вам не падабаецца, пакласці у той час (праўда) у кодзе, вось версія з відавочным умовай: gist.github.com/naugtur/1d2227b09601e50dc9e0
дададзена аўтар naugtur, крыніца

Асцярожна з прынятым адказам, радок ReplaceWith можа ўтрымліваць радок inToReplace, і ў гэтым выпадку будзе бясконцы цыкл ...

Тут лепшы варыянт:

function replaceSubstring(inSource, inToReplace, inReplaceWith)
{
    var outString = [];
    var repLen = inToReplace.length;

    while (true)
    {
        var idx = inSource.indexOf(inToReplace);
        if (idx == -1)
        {
            outString.push(inSource);
            break;
        }

        outString.push(inSource.substring(0, idx))
        outString.push(inReplaceWith);

        inSource = inSource.substring(idx + repLen);
    }

    return outString.join("");
}
0
дададзена
У выпадку, калі вам не падабаецца, пакласці у той час (праўда) у кодзе, вось версія з відавочным умовай: gist.github.com/naugtur/1d2227b09601e50dc9e0
дададзена аўтар naugtur, крыніца

вы можаце атрымаць першае ўваходжанне з дапамогай IndexOf:

var index=str.indexOf(token);

а затым функцыя, як гэта замяніць яго

String.prototype.replaceAt=function(index, tokenvalue) {
      return this.substr(0, index) + character + this.substr(index+character.length);
   }
0
дададзена

вы можаце атрымаць першае ўваходжанне з дапамогай IndexOf:

var index=str.indexOf(token);

а затым функцыя, як гэта замяніць яго

String.prototype.replaceAt=function(index, tokenvalue) {
      return this.substr(0, index) + character + this.substr(index+character.length);
   }
0
дададзена