Maintenir du texte mais éliminer CR LF entre les balises
-
15-11-2019 - |
Question
Compatriotes exxateurs,
J'ai un fichier plat plein d'expressions comme:
SELECT * FROM CONVENIENT_ONE_LINE_QUERY
"SELECT * FROM THIS_QUERY
WHERE IS_SPREAD_OVER == 123
ORDER BY MULTIPLE_LINES
HAVING AND_IS_BETWEEN_QUOTES"
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER
Je veux éliminer le CRLF entre Les citations et les citations elles-mêmes, de sorte que toutes mes requêtes sont des doublures pratiques comme ça:
SELECT * FROM CONVENIENT_ONE_LINE_QUERY
SELECT * FROM THIS_QUERY WHERE IS_SPREAD_OVER == 123 ORDER BY MULTIPLE_LINES HAVING BUT_IS_BETWEEN_QUOTES
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER
Veuillez publier la saveur regex utilisée dans la solution. J'utilise TextCrawler, qui prétend être ECMA262 (identique à VBScript / JavaScript) et le plus proche que je suis arrivé à une solution est quelque chose comme:
(\r\n".*)(.*)\r\n(.*"\r\n)
Pardonnez mon n00biness. Meilleures salutations, Lynx Kepler
La solution
Vous pouvez d'abord supprimer tous les CRLF si le prochain "
est à la fin d'une ligne:
result = subject.replace(/\r\n(?=[^"]*"$)/mg, " ");
Explication:
\r\n # Match a CRLF
(?= # if and only if
[^"]* # it is followed by any number of non-quote characters
" # and a quote
$ # at the end of a line
) # End of lookahead.
Cela transforme votre exemple en
SELECT * FROM CONVENIENT_ONE_LINE_QUERY
"SELECT * FROM THIS_QUERY WHERE IS_SPREAD_OVER == 123 ORDER BY MULTIPLE_LINES HAVING AND_IS_BETWEEN_QUOTES"
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER
Ensuite, dans une deuxième étape, supprimez les citations:
result = subject.replace(/^"|"$/mg, "");
Autres conseils
Avec Perl, vous pourriez faire quelque chose comme:
s/^"([^"]*)"$/$s = $1; $s =~ s!(?:\n|\r)+! !g; $s/meg