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,