Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что означает [^] (https://javascript.ru/forum/misc/49266-chto-oznachaet-%5B%5E%5D.html)

riva 05.08.2014 14:50

Вот с чем работаю я -
var str = '"abc"de"\n';

Эту строку мне нужно распарсить по следующим условиям -
Цитата:

1.Перед кавычкой обязательно должно находится начало строки или знак переноса строки \n.
2.Условие номер один не должно включаться в результат.
3.После закрывающей кавычки обязательно должно идти конец строки или знак переноса строки \n.
4.Условие номер три не должно включаться в результат.
Следуя этому плану у меня получилось -
var re = /(^|\n)"([\s\S]+)"($|\n)/

Получается, что третий элемент тот, что мне и был нужен.
Цитата:

[ '"abc"de"\n', '', 'abc"de', '\n', index: 0, input: '"abc"de"\n' ]
Может кто-нибудь сможет найти у меня ошибку или посоветовать чего?

Цитата:

Есть мнение что и циклы с условиями не работают...
Меня массив вместо единого результата путает.

edison 05.08.2014 16:32

/(?:^|\n)"([\s\S]+)"(?:$|\n)/

/^"([\s\S]+)"$/m

но это еще не конец)) '"abc"de"\n"abc"de"';))
ну допустим /^"([\s\S]+?)"$/m
но все равно не идеал)) , тебе виднее как именно нужно сделать дальше.
Из за отсутствия просмотра назад может придется еще что-то кроме регулярки делать. Хотя с \n^$ в этом плане проще, чем другими символами. По крайней мере в данном случае.

Aetae 05.08.2014 16:48

Вообще если есть уверенность что первый символ точно ковычка, то можно извратиться так:
alert('"abc"de"\r\n"abc"deвак"'.match(
    /[^"\r\n]+.*(?="$)/mg
))

riva 05.08.2014 17:34

Aetae , объясните пожалуйста выражение [^"\r\n].
А то я на него смотрю и понимаю, как - начать с кавычки, за которой идет перенос строки, но эти знаки не включать в результат. Так?
Или они говорят - вообще не обращать внимания на эти символы и выводить все, кроме них самих?
Это как бы и есть мой вопрос из-за которого я тему создал.

Aetae 05.08.2014 17:46

riva, был же ответ:
Цитата:

Сообщение от WorM32 (Сообщение 324371)
[^ab]+ — "искать любые символы кроме a и b"

^ - вне квадратных скобок - начало строки.
^ - внутри квадратных скобок - отрицание.

Как-то так, если упрощённо:
" - не подходит под [^"\r\n]+, пропускаем
a - подходит под [^"\r\n]+, начинаем получать результат
b - подходит под [^"\r\n]+, берём
c - подходит под [^"\r\n]+, берём
" - не подходит под [^"\r\n]+, переходим к .*(?="$), подходит под .*(?="$), берём
d - подходит под .*(?="$), берём
e - подходит под .*(?="$), берём
" - не подходит под .*(?="$) закончили первое совпадение
\r - не подходит под [^"\r\n]+, пропускаем
\n - не подходит под [^"\r\n]+, пропускаем
" - не подходит под [^"\r\n]+, пропускаем
a - подходит под [^"\r\n]+, начинаем получать результат
b - подходит под [^"\r\n]+, берём
c - подходит под [^"\r\n]+, берём
" - не подходит под [^"\r\n]+, переходим к .*(?="$), подходит под .*(?="$), берём
d - подходит под .*(?="$), берём
e - подходит под .*(?="$), берём
в - подходит под .*(?="$), берём
а - подходит под .*(?="$), берём
к - подходит под .*(?="$), берём
" - не подходит под .*(?="$) закончили второе совпадение

riva 05.08.2014 17:56

Цитата:

Сообщение от Aetae
riva, был же ответ:

Ну тогда мне это не подходит. Я же писал -
Цитата:

1.Перед кавычкой обязательно должно находится начало строки или знак переноса строки \n.
То есть, мне нужно, чтобы в условии обязательно было упоминание того, что перед открывающей кавычкой находится ^(начало строки) или \n(перенос строки), а у Вас получается, что Вы исключаете обязательные условия из выражения.

Aetae 05.08.2014 18:08

Ну нету в js regexp'ах просмотра назад, увы.
Так что придётся вам иметь дело с массивами:):
alert('"abc"de"\n'.match(
    /^"(.*)"$/m
))

riva 05.08.2014 18:19

Я пытаюсь комменты распарсить, но пока увы, безуспешно.
/**
 * Test-1
 * Test-2
 */

Вот так выглядит строка, если в файле только один коммент начатый с начала документа.
'/**\n * Test-1\n * Test-2\n */'

Пока остановился на ограничении количества звездочек, но ограничение в фигурных скобках у меня почему-то не работают..

Aetae 05.08.2014 18:41

alert(
'/**\n * Test-1\n * Test-2\n */'.replace(/^\/\*\*\s+\*\s+/,'').replace(/\s*\*\/$/,'').split(/[\r\n]+\s\*\s/)
)

riva 06.08.2014 12:30

Aetae, Спасибо! Но на Ваш пример, я пока только бегло глазами пробежал и всячески стараюсь от него убирать глаза. Я в js никогда не делал регуляки и мне хочется самому до этого дойти и во все разобраться, конечно с Вашей помощью.

У меня вот какой вопрос - как мне уже подсказали в это теме, если нужно из строки 'abcde' выбрать только символы 'cde', то нужно сделать так -
/ab(cde)/

И тогда элемент под индексом один будет той строкой, которую и хотели получить. Но стоит включить флаг g, как все перестает работать.
Как сделать, чтобы из строки выбрались только 'cde'? Желателньно какой-то универсальный вариант, так-как у меyz очень сложный пример.
var str = 'abcde abcde';
var re = /ab(cde)/g;


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