J'ai écrit une expression régulière pour récupérer la chaîne de code HTML, mais il semble que l'indicateur multiligne ne fonctionne pas.
Ceci est mon modèle et je veux obtenir le texte dans la h1
balise.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
J'ai créé une chaîne pour le tester. Lorsque la chaîne contient "\ n", le résultat est toujours nul. Si j'ai supprimé tous les "\ n", cela m'a donné le bon résultat, peu importe avec ou sans le /m
drapeau.
Quel est le problème avec mon regex?
javascript
regex
Peter Mortensen
la source
la source
dotAll
modificateur pour que vous puissiez le faire/.../s
et vos points correspondront également à de nouvelles lignes. Depuis juillet 2017, il est derrière un drapeau dans Chrome.Réponses:
Vous recherchez le
/.../s
modificateur, également appelé modificateur dotall . Il force le point.
à correspondre également aux nouvelles lignes, ce qu'il ne fait pas par défaut.La mauvaise nouvelle est qu'elle
n'existe pas en JavaScript(elleexiste depuisES2018, voir ci-dessous) . La bonne nouvelle est que vous pouvez contourner ce problème en utilisant une classe de caractères (par exemple\s
) et sa négation (\S
) ensemble, comme ceci:Donc, dans votre cas, l'expression régulière deviendrait:
À partir d'ES2018, JavaScript prend en charge le
s
drapeau (dotAll), donc dans un environnement moderne, votre expression régulière pourrait être telle que vous l'avez écrite, mais avec uns
drapeau à la fin (plutôt quem
;m
change la façon^
et le$
travail, non.
):la source
.
, mais faire correspondre les espaces aussi (\s
) signifie qu'il correspond\n
(ce qui.
ne fait pas en JavaScript, ou peut être fait avec les
drapeau).[^]
fonctionne également pour faire correspondre n'importe quel caractère, y compris les sauts de ligne, en JavaScript. Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?
quantificateur au lieu de*
afin d'éviter la gourmandise. Cela évitera d'attraper le dernier <h1> du document: ce n'est probablement pas ce que vous voulez et ce n'est pas efficace car l'expression régulière continuera à rechercher <h1> jusqu'à la fin de la chaîne même si elle l'a déjà trouvé auparavant.Vous voulez le
s
modificateur (dotall), qui n'existe apparemment pas en Javascript - vous pouvez le remplacer.
par [\ s \ S] comme suggéré par @molf. Lem
modificateur (multiligne) fait correspondre les lignes ^ et $ plutôt que la chaîne entière.la source
s
drapeau (ES2018). :-)[\s\S]
n'a pas fonctionné pour moi dans nodejs 6.11.3. Basé sur la documentation RegExp , il dit d'utiliser[^]
ce qui fonctionne pour moi.Par exemple:
/This is on line 1[^]*?This is on line 3/m
où le *? est la capture non gourmande de 0 ou plusieurs occurrences de [^].
la source
[^]
signifie: c'est comme une double négation: "correspondre à n'importe quel caractère qui n'est pas dans cette liste vide " et donc cela revient à dire "correspondre à n'importe quel caractère" .Le modificateur dotall est en fait devenu JavaScript en juin 2018, c'est-à-dire ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
la source
Ma suggestion est qu'il est préférable de diviser la chaîne de plusieurs lignes avec "\ n" et de concaténer les divisions de la chaîne d'origine et devient une seule ligne et facile à manipuler.
la source