Ce qui est une plate-forme de regex pour la suppression des sauts de ligne?
Je suis sûr que cela a été demandé avant, mais je ne la trouve pas.
Fondamentalement, si vous êtes de l'analyse d'un fichier texte d'origine inconnue et souhaitez remplacer les sauts de ligne avec un autre séparateur, est-ce la meilleure regex, ou est-il une autre?
(\r\n)|(\n)|(\r)
- Ne vous vous souciez de la vieille-Mac-style de sauts de ligne (
\r
), ou seulement sur Unix et Windows (\n
et\r\n
)? - double possible de Expression Régulière correspondant de la croix-plate-forme de caractères de saut de ligne
Vous devez vous connecter pour publier un commentaire.
Fletcher - cela ne me le demande une fois avant.
Ici, vous allez: Expression régulière correspondant de la croix-plate-forme de caractères de saut de ligne
De vérifier si votre moteur d'expressions régulières prend en charge
\R
comme une abréviation de la classe de caractères et vous n'aurez pas besoin d'être concernés par les différentes Unicode retour chariot /saut de ligne combos. Si elles sont appliquées correctement, vous pouvez alors répondre à tous les différents ascii ou Unicode, les fins de ligne de manière transparente à l'aide de\R
.En Unicode, vous devez détecter
NEL
(OS/390 de fin de ligne, \x85)LS
(Séparateur de Ligne, \x2028) etPS
(Paragraphe Séparateur, \x2029) si vous voulez être complètement croix-plate-forme de ces jours.Il est discutable de savoir si LS, NEL, et le PS doivent être traités comme des sauts de ligne, les fins de ligne, ou un espace blanc. La norme XML 1.0, par exemple, ne reconnaît pas NEL comme un caractère de saut de ligne. ECMAScript traite
LS
etPS
comme des sauts de ligne, maisNEL
comme des espaces. Perl unicode regexs permettra de traiterVT
,FF
,CR
,CRLF
,NEL
,LS
etPS
comme des sauts de ligne dans le but de^
et$
regex méta-caractères.La Unicode Guide De Mise En Œuvre (section 5.8) et le tableau 5.3) est probablement le meilleur pari de ce que le traitement définitif de ce qu'est un "saut de ligne" est.
Si vous ne sont concernés par ascii avec le DOS/Windows/Unix/Mac classic variantes, l'expression régulière équivalente à
\R
est(?>\r\n|[\r\n])
En Unicode, l'équivalent de
\R
est(?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029)
La\x0b
à il y a une tabulation verticale; encore une fois, cela peut ou peut ne pas vous convenir définition de ce qu'est un saut de ligne, mais qui ne correspond pas à la recommandation de l'Unicode Implantation. (FF
, ou\x0C
n'est pas inclus dans la regex depuis un Formulaire de Flux est une nouvelle page, pas une ligne dans la définition.)\x2028|\x2029
partie doit être écrit\u2028|\u2029
, parce que\xhh
est utilisé uniquement pour les 2 chiffres hex valeurs de caractère, tout en\uhhhh
est utilisé pour les 4 chiffres hex valeurs de caractère.La regex pour trouver Unicode terminateur de ligne doit être
(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])
plutôtque comme drewk écrit, au moins en Perl. Prises directement à partir de l'perl
5.10.0 de la documentation (il a été supprimé dans les versions ultérieures).
Remarque les accolades après
\x
: U+2029 est\x{2029}
mais
\x2029
est un ASCII espace (U+0020) + un chiffre 2 + unle chiffre 9.
\n
à l'extérieur d'une classe de caractères ,n'est pas garanti pour correspondre à\x{0a}
.Si votre plate-forme ne prend pas en charge la
\R
classe comme suggéré par @dawg ci-dessus, vous pouvez toujours être en mesure de faire un assez élégant et robuste solution si votre plate-forme prend en charge négatif lookaround ou soustraction de classe de caractères (par exemple, dans la classe Java soustraction est par le biais de la la syntaxe[x&&[^y]]
).Dans la plupart des expresssion grammaires, le caractère de point est défini comme "n'importe quel caractère sauf le caractère de saut de ligne" (voir, par exemple, pour le JavaScript, ici). Si vous avez quelque chose avec les caractéristiques suivantes:
Depuis que je suis en train de travailler en JavaScript, qui autant que je sache, n'a pas le
\R
abréviation ou caractère de classe de la soustraction, je peux encore utiliser anticipation négatif pour obtenir ce que je veux. L'expression régulière suivante correspond à tous les retours à la ligne:Et le code JavaScript suivant, au moins lorsqu'il est exécuté dans le navigateur Chrome 42.0.2311.90 m sur Windows 7, efface tous les types de retours à la ligne que JavaScript (c'est à dire le "ECMAScript" mentionné dans @dawg du troisième alinéa) reconnaît:
JS:
Il suffit de remplacer
/[\r\n]+/g
avec une chaîne vide""
.Il va remplacer tous les
\r
et\n
n'importe quel ordre elles apparaissent dans la chaîne.