• регулярки А есть ли на жуйке настолько искушённые люди которые легко между делом составят регулярное выражение для следующей задачи:
    Нужно составить регулярку для нахождения запятой, но чтоб она не была внутри каки-нибудь кавычек.
    ♡ recommended by @stanis, @MarkS

Replies (34)

  • @altesack, Вообще, это не решается регулярными выражениями =)) Так как контекстно-зависимое.
  • @altesack, Так что вопрос в конкретной реализации, многие форки поддерживают рекурскивные регулярки — на них решается.
  • @altesack, тут нужна стековая машина, это вне области задачи регулярок. можешь копать в сторону рекурсивных регулярок, но это не православно
  • @datacompboy, Угу, я тоже думал за рекурсию.
  • @altesack, Спасибо всем за ответ. Учебник по регуляркам отложен в сторону до следующего раза.
  • @altesack, Это подойдёт? (?!\'),(?!\')
  • @azzz, нет
  • @altesack, можно попробовать так
    сначала в цикле заменяем кавычки парными
    ([^"]*)" -> '\1«'
    («[^"]*)" -> '\1»'
    потом ищем «[^»]*,

    но лично я бы просто перебрал все символы в цикле
  • @altesack, Фигня, это не контекстно-зависимое. Кавычки — это не скобки.
    \" внутри строк нужно распознавать? Кавычки считать и двойные, и ординарные?
  • @lispnik, Если бы. надо гарантировать что перед запятой только четное число кавычек, но ситуация усложняется что двойная кавычка внутри одинарной пары не считается и наоборот.
    Это таки контекстная задача.
  • @datacompboy, Это не усложняет ни-че-го.
  • @lispnik, Тогда с удовольствием жду регекспа, который не сломается на следующих тестах:
    " " " " " , " => no
    " " " " , " " => yes
    " ' " ' " ' , " " => yes
    " ' ' " " ' " ' ' ' , ' => no
  • @lispnik, ну напиши, чё
  • @altesack, Уже пишу
  • @lispnik, Кавычками считаем только двойные кавычки. Наверное надо было сказать сразу
  • @altesack, Тюююю!!!! Тогда всё просто — /^([^"]["][^"]["])*[^",][,]/
  • @altesack, Опечатался, звездочку забыл — /^([^"]["][^"]["])[^",][,]/
  • @lispnik, datacompboy@nuuzerpogodible:~$ ruby aa.rb
    aa.rb:5: syntax error, unexpected ',', expecting ')'
    aa.rb:6: syntax error, unexpected ',', expecting ')'
    aa.rb:7: syntax error, unexpected ',', expecting ')'
    aa.rb:8: syntax error, unexpected ':', expecting keyword_do_cond or ';' or '\n'
    aa.rb:9: syntax error, unexpected keyword_not, expecting '('
    print s, not not m.match(s)
  • @datacompboy, Я не знаю, где ты взял файл с расширением rb и кто тебе сказал, что его надо скармливать ruby. У файла было расширение py и скармливать его надо питону.
    И прошу прощения, что не на лиспе, на нетбуке обнаружился только питон. :D
  • @lispnik, Вот честно — не вижу у гиста в упор указания языка :)
  • @datacompboy, Слева вверху, над столбцом с номерами строк, написано, что файл называется re.py
  • @lispnik, о! Спасибо, буду теперь знать. на pastebin.ca как-то заметнее это дело.

    Да, в общем-то, туплю уже на сон грядущий. Какая разница что внутри, если стартовать от начала =)))
  • @datacompboy, Спасибо. Но желаемого эффекта не получил. Не знаю как в кавычках, но похоже простые запятые не находит
    Я про ^([^"]["][^"]["])*[^",][,]
    В любом случае спасибо

    Может подробнее опишу задачу. Юзаю PHP
    $row=preg_split('/^([^"]["][^"]["])*[^",][,]/',$str);
    Где str строка из CSV файла, где данные разделены запятыми, а если запятая есть внутри данных, то данные заключены в кавычки
    Никакие экранированные кавычки опознавать не нужно.
  • @altesack, Я же говорю — там пропущена одна звездочка перед запятой!
    $row=preg_split('/^([^"]["][^"]["])[^",][,]/',$str);
    я сильно туплю перед сном
  • @datacompboy, Ещё можно кликнуть на ссылку raw и получить файл re.py
  • @altesack, csv парсится средствами php
  • @SunChaser, fgetcsv / fputcsv
  • @SunChaser, Увы. Это неправильный CSV
  • @altesack, а что в нем такого?
  • @SunChaser, Не заканчивается на ";" и не каждая ячейка заключена в кавычки
  • @altesack, с каких пор это обязательно для сsv? это же не json
  • @SunChaser, По крайней мере ексель его не понял
  • @altesack, а oocalc должен. во всяком случае, я формировал такой же "корявый" csv и открывал его oocalc-ом