Aquí hay una expresión regular que utilicé hace un tiempo que también trata con citas escapadas Y delimitadores escapados. Probablemente sea excesivo para sus requisitos (columnas de conteo) pero tal vez lo ayude a usted u otra persona en el futuro con su análisis sintáctico.
(?<=^|(?<!\\)\|)(\".*?(?<=[^\\])\"|.*?(?<!\\(?=\|))(?=")?|)(?=\||$)
and broken down as:
(?<=^|(?<!\\)\|) // look behind to make sure the token starts with the start anchor (first token) or a delimiter (but not an escaped delimiter)
( // start of capture group 1
\".*?(?<=[^\\])\" // a token bounded by quotes
| // OR
.*?(?<!\\(?=\|))(?=")? // a token not bounded by quotes, any characters up to the delimiter (unless escaped)
| // OR
// empty token
) // end of capture group 1
(?=\||$) // look ahead to make sure the token is followed by either a delimiter or the end anchor (last token)
when you actually use it it'll have to be escaped as:
(?<=^|(?<!\\\\)\\|)(\\\".*?(?<=[^\\\\])\\\"|.*?(?<!\\\\(?=\\|))(?=\")?|)(?=\\||$)
Es complicado, pero no hay método para esta locura: Otras expresiones regulares que googled caerían sobre si una columna al principio o al final de la línea estaba vacía, cotizaciones delimitados estaban en lugares extraños, la línea o la columna comenzó o finalizó con un delimitador que se escapó, y un montón de otros escenarios de borde marginal.
El hecho de que esté utilizando una tubería como delimitador hace que esta expresión regular sea aún más difícil de leer/comprender. Un consejo es cuando ves un tubo en sí mismo "|", es un OR condicional en expresiones regulares, y cuando se escapó "\ |", es tu delimitador.
¿Desea contar solo o desea extraer los datos también? – nhahtdh
Solo necesito el recuento de columnas. – Nash
puede dividir usando '\" \ | 'y obtener la longitud de la matriz –