Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как распознать экранированные символы ("a" vs "\a")? (https://javascript.ru/forum/misc/59954-kak-raspoznat-ehkranirovannye-simvoly-vs-%5C.html)

FINoM 04.12.2015 14:08

Как распознать экранированные символы ("a" vs "\a")?
 
Всем привет. Как отличить "a" от "\a"?

Если конкретно, мне нужно разбить строку:
'x.y'.split('.'); // ['x', 'y']


А так, не должно разбивать:
'x\.y'.split('.'); // должно быть ['x.y']


Сам сплит можно заменить чем угодно (регуляркой, например).

String.raw не предлагать.

laimas 04.12.2015 14:46

Так "a" от "\a" нужно различить или же "." от "\."?

FINoM 04.12.2015 14:53

Цитата:

Сообщение от laimas
Так "a" от "\a" нужно различить или же "." от "\."?

Точку. "a" - это обобщение.

nerv_ 04.12.2015 15:09

вариант
Код:

if re.test(string) then string.split()

FINoM 04.12.2015 15:16

nerv_, проблема в том, что
"string." === "string\."

Мне прислали багрепорт, а как пофиксить, без добавления флагов, я пока не понимаю.

Яростный Меч 04.12.2015 16:21

сплитом, похоже, никак.

вот, вариант, в котором есть экранирование точек и "экранирование экранирований" :)

var str = "12.34\\.56\\\\.78\\\\\\.90";
var m, rx = /(?:^|[^\\])(?:\\\\)*\./g;

var index = 0;
var arr = [];
while (m = rx.test(str)) {
  arr.push(str.substring(index, rx.lastIndex - 1));
  index = rx.lastIndex;
}
arr.push(str.substring(index, str.length));

console.log(arr);

FINoM 04.12.2015 16:24

Цитата:

Сообщение от Яростный Меч
экранирование экранирований

Ну это жесть.

Яростный Меч 04.12.2015 16:26

Цитата:

Сообщение от FINoM (Сообщение 398719)
Ну это жесть.

это не жесть, это "жисть" )
так уж мир устроен, что оное есть везде где имеются экранирования.

Erolast 04.12.2015 17:21

Цитата:

Как отличить "a" от "\a"
Никак. Экранирование происходит на этапе обработки литерала, так что только экранированием экранирования.

Для меньшей жести юзер может использовать String.raw + template strings из ES6, вот так:
app.bindNode(String.raw`int\.int`, String.raw`\.int`);

Этот код аналогичен такому:
app.bindNode("int\\.int", "\\.int");

FINoM 04.12.2015 17:25

Цитата:

Сообщение от Erolast
Для меньшей жести юзер может использовать String.raw + template strings из ES6, вот так

Ну тогда возникает меньшее зло, но все же зло: не получится использовать путь к свойству, который включает слеш в конце. Это, конечно же, первое, что мне пришло в голову.

nerv_ 04.12.2015 20:34

Цитата:

Сообщение от FINoM (Сообщение 398709)
nerv_, проблема в том, что
"string." === "string\."

Мне прислали багрепорт, а как пофиксить, без добавления флагов, я пока не понимаю.

alert("string\.") // это экранирование точки;
alert("string\\.") // это двойной обратный слеш;

FINoM 05.12.2015 11:34

nerv_, ну а что человеку делать, если свойство заканчивается двойным обратным слешем?
"a\\.b"
Он хочет именно так, без экранирования.

nerv_ 05.12.2015 12:14

FINoM, я говорю, что твой пример, процитированный мной выше, выдает истину потому, что обратный слеш воспринимается интерпретатором в данном случае как экранирование. Т.е. его просто нет в переменной/выводе.
По крайней мере мне так кажется :)

Цитата:

Сообщение от FINoM
ну а что человеку делать, если свойство заканчивается двойным обратным слешем?

не знаю, что делать человеку. Вижу только, что у тебя проблема в логике интерпретации символов, обозначенных в issue.

Цитата:

Сообщение от FINoM
ну а что человеку делать, если свойство заканчивается двойным обратным слешем?
"a\\.b"

нету здесь "двойнго обратного слеша"
alert("a\\.b");

FINoM 05.12.2015 12:18

Цитата:

Сообщение от nerv_
нету здесь "двойнго обратного слеша"

Сорри, одним обратным слешем.


Часовой пояс GMT +3, время: 00:56.