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

Était-ce utile?

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

enter image description here

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top