Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 05.08.2014, 14:50
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Вот с чем работаю я -
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' ]
Может кто-нибудь сможет найти у меня ошибку или посоветовать чего?

Цитата:
Есть мнение что и циклы с условиями не работают...
Меня массив вместо единого результата путает.
Ответить с цитированием
  #12 (permalink)  
Старый 05.08.2014, 16:32
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

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

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

но это еще не конец)) '"abc"de"\n"abc"de"')
ну допустим /^"([\s\S]+?)"$/m
но все равно не идеал)) , тебе виднее как именно нужно сделать дальше.
Из за отсутствия просмотра назад может придется еще что-то кроме регулярки делать. Хотя с \n^$ в этом плане проще, чем другими символами. По крайней мере в данном случае.
Ответить с цитированием
  #13 (permalink)  
Старый 05.08.2014, 16:48
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

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

Последний раз редактировалось Aetae, 05.08.2014 в 16:58.
Ответить с цитированием
  #14 (permalink)  
Старый 05.08.2014, 17:34
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Aetae , объясните пожалуйста выражение [^"\r\n].
А то я на него смотрю и понимаю, как - начать с кавычки, за которой идет перенос строки, но эти знаки не включать в результат. Так?
Или они говорят - вообще не обращать внимания на эти символы и выводить все, кроме них самих?
Это как бы и есть мой вопрос из-за которого я тему создал.
Ответить с цитированием
  #15 (permalink)  
Старый 05.08.2014, 17:46
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

riva, был же ответ:
Сообщение от WorM32 Посмотреть сообщение
[^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 - подходит под .*(?="$), берём
в - подходит под .*(?="$), берём
а - подходит под .*(?="$), берём
к - подходит под .*(?="$), берём
" - не подходит под .*(?="$) закончили второе совпадение
__________________
29375, 35

Последний раз редактировалось Aetae, 05.08.2014 в 17:57.
Ответить с цитированием
  #16 (permalink)  
Старый 05.08.2014, 17:56
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

Сообщение от Aetae
riva, был же ответ:
Ну тогда мне это не подходит. Я же писал -
Цитата:
1.Перед кавычкой обязательно должно находится начало строки или знак переноса строки \n.
То есть, мне нужно, чтобы в условии обязательно было упоминание того, что перед открывающей кавычкой находится ^(начало строки) или \n(перенос строки), а у Вас получается, что Вы исключаете обязательные условия из выражения.
Ответить с цитированием
  #17 (permalink)  
Старый 05.08.2014, 18:08
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Ну нету в js regexp'ах просмотра назад, увы.
Так что придётся вам иметь дело с массивами:
alert('"abc"de"\n'.match(
    /^"(.*)"$/m
))
__________________
29375, 35
Ответить с цитированием
  #18 (permalink)  
Старый 05.08.2014, 18:19
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

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

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

Пока остановился на ограничении количества звездочек, но ограничение в фигурных скобках у меня почему-то не работают..
Ответить с цитированием
  #19 (permalink)  
Старый 05.08.2014, 18:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

alert(
'/**\n * Test-1\n * Test-2\n */'.replace(/^\/\*\*\s+\*\s+/,'').replace(/\s*\*\/$/,'').split(/[\r\n]+\s\*\s/)
)
__________________
29375, 35
Ответить с цитированием
  #20 (permalink)  
Старый 06.08.2014, 12:30
Кандидат Javascript-наук
Отправить личное сообщение для riva Посмотреть профиль Найти все сообщения от riva
 
Регистрация: 24.06.2013
Сообщений: 115

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что означает знак += lobzinatr Общие вопросы Javascript 1 15.04.2013 21:16
как получить тот кусок текста который сейчас видно на экране ? mitiya Общие вопросы Javascript 27 21.03.2013 12:21
что означает??? dimon888951 jQuery 9 28.02.2012 18:42
помогите, что означает firstChild Dron13 Events/DOM/Window 1 15.01.2011 11:57
Как (эффективно) изучать JavaScript? JSTalker Общие вопросы Javascript 33 23.12.2010 03:13