Jak globalnie zamienić ukośnik w ciągu JavaScript?


Odpowiedzi:


256

Poniższe rozwiązanie wystarczy, ale zastąpi tylko jedno wystąpienie:

"string".replace('/', 'ForwardSlash');

W przypadku globalnej zamiany lub jeśli wolisz wyrażenia regularne, wystarczy, że unikniesz ukośnika:

"string".replace(/\//g, 'ForwardSlash');

3
Pierwszy fragment kodu nie zastępuje globalnej. Nie jestem pewien, jak wykonać globalną zamianę w sposób inny niż wyrażenia regularne.
BoltClock

Ach tak, nie próbowałem tego z czymś więcej niż ukośnikiem. Można to zrobić, "string".replace('/', 'ForwardSlash', 'g')ale jest to niestandardowy argument, który działa tylko w Firefoksie afaik.
Seldaek

1
"string".replace(/\//g, 'ForwardSlash');działa, ale usuwa / g z tego i nie działa.
johntrepreneur

1
@johntrepreneur g oznacza, że ​​jest to globalna zamiana, tj. zastępuje wszystkie wystąpienia dopasowanego /. Bez g zastępuje tylko jedną instancję. A jeśli usuniesz /g, całkowicie złamiesz wyrażenie regularne, ponieważ ostatnie / jest ogranicznikiem końca.
Seldaek

1
@RameshRajendran po prostu taki jest interfejs API ... domyślnie zastępuje tylko raz, a następnie zatrzymuje się, gdy znajdzie taki do zastąpienia. Zobacz także developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Seldaek

27

Użyj literału wyrażenia regularnego z gmodyfikatorem i unikaj ukośnika w przód z ukośnikiem odwrotnym, aby nie kolidował z ogranicznikami.

var str = 'some // slashes', replacement = '';
var replaced = str.replace(/\//g, replacement);

7

Bez użycia wyrażenia regularnego (chociaż zrobiłbym to tylko wtedy, gdy ciąg wyszukiwania jest wprowadzony przez użytkownika):

var str = 'Hello/ world/ this has two slashes!';
alert(str.split('/').join(',')); // alerts 'Hello, world, this has two slashes!' 

4

Czy to jest to, czego chcesz?

'string with / in it'.replace(/\//g, '\\');

4

To zadziałało dla mnie, zmieniając się "//"w sprawiedliwego "/".

str.replace(/\/\//g, '/');

2

Musisz zawinąć ukośnik, aby uniknąć problemów z przeglądarkami lub // komentowania.

str = 'this/that and/if';

var newstr = str.replace(/[/]/g, 'ForwardSlash');

1

Cześć mała poprawka w powyższym skrypcie .. powyższy skrypt pomijający pierwszy znak podczas wyświetlania wyjścia.

function stripSlashes(x)
{
var y = "";
for(i = 0; i < x.length; i++)
{
    if(x.charAt(i) == "/")
    {
        y += "";
    }
    else
    {
        y+= x.charAt(i);
    }
}
return y;   
}

0
var str = '/questions'; // input: "/questions"
while(str.indexOf('/') != -1){
   str = str.replace('/', 'http://stackoverflow.com/');
}
alert(str); // output: "http://stackoverflow.com/questions"

Proponowane wyrażenie regularne /\//gnie działa dla mnie; reszta linii ( //g, replacement);) została zakomentowana.


1
Należy pamiętać, że nie jestem pewien, jak wydajność tego porównuje proponowane rozwiązanie podziału / łączenia macierzy.
Christopher Lincoln

... natknąłem się na to ... wypróbuj inne IDE, używając inteligentniejszego podświetlania składni. Nie polegaj na kolorach swojego edytora kodu, ale wierz w moc stanowych parserów, które poprawnie tokenizują kod w czasie wykonywania.
soletan

0

To jest pomysł Christophera Lincolna, ale z poprawnym kodem:

function replace(str,find,replace){
    if (find != ""){
        str = str.toString();
        var aStr = str.split(find);
        for(var i = 0; i < aStr.length; i++) {
            if (i > 0){
                str = str + replace + aStr[i];
            }else{
                str = aStr[i];
            }
        }
    }
    return str;
}

Przykładowe zastosowanie:

var somevariable = replace('//\\\/\/sdfas/\/\/\\\////','\/sdf','replacethis\');

Globalna zamiana ciągu znaków w JavaScript jest niepotrzebnie skomplikowana. Ta funkcja rozwiązuje ten problem. Prawdopodobnie ma to niewielki wpływ na wydajność, ale jestem pewien, że jest on pomijalny.

Oto alternatywna funkcja, wygląda znacznie czyściej, ale jest średnio o około 25 do 20 procent wolniejsza niż powyższa funkcja:

function replace(str,find,replace){
    if (find !== ""){
        str = str.toString().split(find).join(replace);
    }
    return str;
}

-1

Możesz utworzyć RegExpobiekt, aby był bardziej czytelny

str.replace(new RegExp('/'), 'foobar');

Jeśli chcesz zastąpić je wszystkie, dodaj "g"flagę

str.replace(new RegExp('/', 'g'), 'foobar');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.