Неверное разбиение строк в JavaScript - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь разбить строку на основе разделителя \$.Я попытался это безуспешно.

Код, который у меня есть, находится по адресу https://js.do/sun21170/77657,, который также вставлен ниже.

Вопрос : что я делаю не так в этом примере при разбиении по\$?

var trickyString = "sd sewq wee r r ttttt $300 rrtrt utu iwiwi \$500 kjgf ihj \$215 ghi"; 

//document.getElementById("div0").innerHTML = trickyString;

function splitString() {
    //Why is splitting by \$ not giving 3 elements but is instead giving 4 elements?
    var array1 = trickyString.split(/\$/);
    document.getElementById("div1").innerHTML = "<b>Length = " + array1.length + "</b>";
    for (var i = 0; i < array1.length; i++) {
        document.getElementById("div1").innerHTML += "<br>" + array1[i];
    }

    var array2 = trickyString.split("$");
    document.getElementById("div2").innerHTML = "<b>Length = " + array2.length + "</b>";
    for (var j = 0; j < array1.length; j++) {
        document.getElementById("div2").innerHTML += "<br>" + array2[j];
    }
}
<button onclick="splitString();return false;">Split a tricky string</button>

<h4>Tricky string</h4>
<div id="div0" style="color:green">sd sewq wee r r ttttt $300 rrtrt utu iwiwi \$500 kjgf ihj \$215 ghi</div>

<h4>Split using \$ as delimiter</h4>
<div id="div1" style="color:red"></div>

<h4>Split using $ as delimiter</h4>
<div id="div2"  style="color:blue"></div>

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Ваша проблема проистекает из того факта, что в вашем регулярном выражении /\$/, \$ интерпретируется как требование, чтобы $ считался буквальным символом.

Регулярным выражением, которым вы должны бытьиспользование /\\\$/.Как видно на regex101.com

\\ matches the character \ literally (case sensitive)
\$ matches the character $ literally (case sensitive)

enter image description here

Вы также страдаете от аналогичной проблемы в вашей строке, где вы находитесьположив \$, он рассматривается как запрос буквально использовать символ $.Это можно увидеть, если вы сделаете console.log(trickyString);, вы заметите, что \ нет в выводе.Вам нужно будет дважды избегать кавычек:

const trickyString = "sd sewq wee r r ttttt $300 rrtrt utu iwiwi \\$500 kjgf ihj \\$215 ghi;"
0 голосов
/ 18 октября 2018

Проблема в том, что косые черты имеют особое значение как в строке JS, так и в RegEx.

Здесь есть две критические части:

var trickyString = "sd sewq wee r r ttttt $300 rrtrt utu iwiwi \$500 kjgf ihj \$215 ghi"; 

Должно быть:

var trickyString = "sd sewq wee r r ttttt $300 rrtrt utu iwiwi \\$500 kjgf ihj \\$215 ghi"; 

Поскольку \$ будет интерпретироваться как $.

А также:

var array1 = trickyString.split(/\$/);

Должно быть:

var array1 = trickyString.split(/\\\$/g);

Оба, потому что\$ будет интерпретироваться как $, поэтому первый \\, а $ имеет само по себе особое значение, поэтому второй \$.

Это код, который я использовал:

var trickyString = "sd sewq wee r r ttttt $300 rrtrt utu iwiwi \\$500 kjgf ihj \\$215 ghi"; 

//document.getElementById("div0").innerHTML = trickyString;

function splitString() {
    //Why is splitting by \$ not giving 3 elements but is instead giving 4 elements?
    var array1 = trickyString.split(/\\\$/g);
    document.getElementById("div1").innerHTML = "<b>Length = " + array1.length + "</b>";
    for (var i = 0; i < array1.length; i++) {
        document.getElementById("div1").innerHTML += "<br>" + array1[i];
    }

    var array2 = trickyString.split("$");
    document.getElementById("div2").innerHTML = "<b>Length = " + array2.length + "</b>";
    for (var j = 0; j < array1.length; j++) {
        document.getElementById("div2").innerHTML += "<br>" + array2[j];
    }
}

И вот результаты:

Tricky string
sd sewq wee r r ttttt $300 rrtrt utu iwiwi \$500 kjgf ihj \$215 ghi
Split using \$ as delimiter
Length = 3
sd sewq wee r r ttttt $300 rrtrt utu iwiwi
500 kjgf ihj
215 ghi
Split using $ as delimiter
Length = 4
sd sewq wee r r ttttt
300 rrtrt utu iwiwi \
500 kjgf ihj \
...