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, вот так

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


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