Regex находит запятую не внутри кавычек
ненавижу это говорить, но каждый поток с этим вопросом не помогает мне.
Я проверяю строку за строкой в С#
примеры данных:
bob jones,123,55.6,,,"Hello , World",,0
jim neighbor,432,66.5,,,Andy "Blank,,1
john smith,555,77.4,,,Some value,,2
Regex для выбора запятых вне кавычек не разрешает вторую строку, это ближайший.
Ответы
Ответ 1
Отстаньте и удивляйтесь!
Вот регулярное выражение, которое вы ищете:
(?!\B"[^"]*),(?![^"]*"\B)
Вот демонстрация:
regex101 demo
- Он не соответствует второй строке, потому что введенный
"
не имеет закрывающей кавычки.
- Он не будет соответствовать таким значениям:
,r"a string",10
, потому что буква на краю "
создаст границу слова, а не границу, отличную от слова.
Альтернативная версия
(".*?,.*?"|.*?(?:,|$))
Это будет соответствовать содержимому и запятым и будет совместимо со значениями, которые содержат знаки препинания
regex101 demo
Ответ 2
попробуйте этот шаблон ".*?"(*SKIP)(*FAIL)|,
Демо
Ответ 3
Ниже приведенное выражение представляет собой синтаксический анализ каждого поля в строке, а не целую строку
Применить методическое и отчаянное средство регулярного выражения: Разделить и покорить
Случай: поле не содержит цитаты
- азбука,
- abc (конец строки)
[^,"]*(,|$)
Случай: поле содержит ровно два кавычки
- а "азбука," азбука,
- abc "abc", abc (конец строки)
[^,"]*"[^"]*"[^,"]*(,|$)
Случай: поле содержит ровно одну цитату
- abc "abc (конец строки)
- abc "abc, (и что там нет цитаты до конца этой строки)
[^,"]*"[^,"]$
[^,"]*"[^"],(?!.*")
Теперь, когда у нас есть все случаи, мы тогда '|' все вместе и наслаждайтесь полученным чудовищем.
Ответ 4
import re
print re.sub(',(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)',"",string)
Ответ 5
Лучший ответ, написанный Василием Сиракисом, не работает с отрицательными номерами внутри кавычек, например:
bob jones,123,"-55.6",,,"Hello , World",,0
jim neighbor,432,66.5
Следующее регулярное выражение работает для этой цели:
,(?!(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$))
Но мне не удалось выполнить эту часть ввода:
,Andy "Blank,