Texte et outils quotidiens · Boîte à outils de texte
Pourquoi ^ et $ ne correspondent qu'une seule fois : les indicateurs d'expression régulière dans le navigateur recherchent et remplacent
· Comment ça marche
expressions régulières rechercher et remplacer nettoyage de texte
Explique les indicateurs d'expression régulière JavaScript (global, multiligne et dotAll) et pourquoi une boîte de recherche et de remplacement compilée sans ancres multilignes ^ et $ pour l'ensemble du texte, avec des modèles qui fonctionnent à la place.
Le modèle qui n'a corrigé que la première ligne — que se passe-t-il lorsque vous vous attendez à ce que ^ signifie « début de chaque ligne »
Une liste collée peut contenir le même préfixe indésirable sur chaque ligne, mais la recherche de `^prefix` ne le supprime que de la première ligne. Le résultat surprenant vient de la configuration du modèle, et non de données incohérentes. Dans ToolAcre, `^` identifie le début du texte complet car l'expression régulière est compilée sans mode multiligne.
L'ancre `$` correspondante suit la même règle sur l'autre bord : elle identifie la fin du texte complet, et non chaque ligne se terminant à l'intérieur. Un saut de ligne reste une partie de l’entrée, mais il ne devient pas une autre position d’ancrage. Vérifiez le nombre de remplacements signalé avant d'importer la liste nettoyée ; un compte de un expose immédiatement l’inadéquation.
L'indicateur g — pourquoi « remplacer chaque correspondance en une seule passe » dépend de l'indicateur global défini
ToolAcre construit toujours son modèle de recherche avec l'indicateur global `g`. Ce choix indique à JavaScript de collecter chaque correspondance qui ne se chevauche pas plutôt que de s'arrêter après la première. L'outil appelle d'abord `match` pour déterminer le décompte, puis transmet le même modèle global à `replace`, de sorte que le numéro affiché et la passe de remplacement utilisent une règle de correspondance.
La correspondance globale ne peut pas créer des positions que le modèle ne reconnaît pas. Avec `^prefix`, il n'y a qu'un seul début de texte entier éligible, donc `g` trouve toujours une correspondance. Avec un motif pouvant apparaître sur plusieurs lignes, `g` permet de remplacer toutes les occurrences. Séparez ces questions lors du débogage : les ancres décident où une correspondance peut commencer, tandis que le mode global décide si la recherche continue.
L'indicateur m : comment la multiligne change ^ et $ des ancres de texte entier aux ancres de ligne, et pourquoi cet outil le laisse désactivé
L'indicateur multiligne `m` modifie la façon dont `^` et `$` sont interprétés, leur permettant de reconnaître les positions autour des terminateurs de ligne ainsi que les limites extérieures du texte. ToolAcre n'ajoute pas cet indicateur. Son compilateur utilise `g` pour les recherches sensibles à la casse et `gi` lorsque la sensibilité à la casse est effacée, sans aucun contrôle utilisateur pour les indicateurs supplémentaires.
Laisser la multiligne indisponible maintient l'interface petite, mais cela signifie que les modèles copiés à partir d'un éditeur configuré avec `gm` peuvent se comporter différemment ici. Ne présumez pas qu’une expression familière porte avec elle ses drapeaux. Les lettres d'indicateur JavaScript sont fournies lors de la création de RegExp, et cet outil rejette la syntaxe d'indicateur en ligne non prise en charge plutôt que d'activer silencieusement un autre mode.
L'indicateur s - pourquoi un point ne correspond pas à une nouvelle ligne par défaut et comment faire correspondre plusieurs lignes sans lui
Un point dans cet outil ne correspond pas à un saut de ligne car le compilateur omet également l'indicateur dotAll `s`. Un modèle tel que `BEGIN.*END` peut correspondre lorsque les deux marqueurs sont sur une seule ligne, mais il s'arrête au premier saut de ligne lorsque les marqueurs s'étendent sur plusieurs lignes. L'ajout du mode global ne modifie pas ce que le point lui-même peut consommer.
Lorsqu'une correspondance entre lignes est réellement requise, écrivez explicitement les caractères autorisés. Une classe telle que `[\s\S]*?` peut couvrir les espaces et les non-espaces tout en restant réticente, bien que des modèles généraux méritent d'abord d'être testés sur un petit échantillon. Le compilateur détecte une syntaxe invalide, mais il ne protège pas l'onglet d'une expression coûteuse avec un comportement de retour en arrière sévère.
Faire correspondre explicitement les nouvelles lignes — en utilisant \n dans le modèle pour cibler les débuts et les fins de ligne lorsque la multiligne n'est pas disponible
Pour les débuts de ligne répétés sans mode multiligne, faites correspondre le début du texte ou une nouvelle ligne : `(^|\n)prefix`. La première alternative gère la première ligne et la seconde gère les lignes suivantes en consommant leur nouvelle ligne précédente. Les parenthèses capturent la limite qui correspond, donnant au remplacement un moyen de conserver la structure qui séparait les lignes.
Cette technique suppose des séparateurs de saut de ligne dans le motif. La bibliothèque de texte reconnaît CRLF, LF et Lone CR lors de l'exécution d'opérations de ligne dédiées, mais recherche et remplacement recherche directement la chaîne d'origine. Si le contenu collé utilise une autre forme de fin de ligne, normalisez-le d'abord ou adaptez délibérément l'expression ; sinon, les lignes ultérieures peuvent rester intactes même si elles semblent identiques à l'écran.
Faire correspondre explicitement les limites des lignes avec (^|\n) et conserver le séparateur capturé
Supposons que l'entrée soit `ID: apple`, `ID: pear` et `ID: plum` sur des lignes distinctes. Activez Regex, recherchez `(^|\n)ID: ` et remplacez-le par `$1`. Sur la première ligne, `$1` est la position de départ vide ; sur les lignes suivantes, il s'agit de la nouvelle ligne capturée. Les étiquettes disparaissent tandis que les trois limites de lignes restent en place.
Lisez le nombre de remplacements avant d'accepter le résultat. Trois lignes devraient produire trois remplacements dans cet exemple. Si le compte est un, inspectez le motif réel et les fins de ligne plutôt que de répéter l'opération. L'annulation est disponible après un remplacement, de sorte qu'un petit essai peut confirmer à la fois la correspondance et la reconstruction avant que la même expression ne touche une liste d'importation plus longue.
Ce que cela ne couvre pas : les indicateurs u, i et y et l'insertion de nouvelles lignes dans le remplacement, ce qu'un champ sur une seule ligne ne peut pas faire
L'implémentation utilise également `i` lorsque la sensibilité à la casse est désactivée, mais elle n'expose aucun contrôle pour `u`, `y`, `m` ou `s`. Cet article n'attribue pas de comportement à ces modes indisponibles au-delà de l'explication des effets multilignes et dotAll manquants nécessaires pour l'exemple. Les modèles provenant d'un autre environnement JavaScript doivent être examinés par rapport aux indicateurs que ToolAcre compile réellement.
La source prouve que le texte de remplacement est transmis à JavaScript `String.replace`, donc les substitutions telles que `$1`, `$&` et `$$` conservent leur signification JavaScript. Il n'établit pas toutes les interactions offertes par le champ rendu à partir des fichiers utilisés ici. En particulier, l'insertion de nouvelles lignes physiques via l'interface doit être testée plutôt que déduite du seul plan.
Les autres indicateurs et comportements des champs de remplacement ne sont pas mis en œuvre dans cet outil.
Traitez les indicateurs comme faisant partie d'une expression régulière, même lorsqu'une interface affiche uniquement le corps du modèle. Dans ToolAcre, chaque recherche est globale, le mode facultatif insensible à la casse ajoute `i`, et multiline et dotAll sont absents. Ces faits expliquent pourquoi le remplacement se poursuit dans les correspondances ordinaires tandis que `^`, `$` et dot conservent leurs contraintes par défaut de texte entier et d'une seule ligne.
Pour une liste collée avec préfixe, `(^|\n)prefix` avec `$1` est la solution de contournement pratique car elle nomme la limite et la préserve. Commencez par des lignes représentatives, confirmez le décompte, inspectez la structure de ligne résultante, puis traitez l'ensemble de données complet. Cette procédure transforme un résultat déroutant d’une seule correspondance en une étape de nettoyage révisable avant l’importation.