web-dev-qa-db-fra.com

Regex passe au cas de la peine

J'utilise Notepad ++ pour effectuer un remplacement de texte dans un fichier de langue à 5453 lignes. Le format des lignes du fichier est:

variable.name = Variable Value Over Here, that''s for sure, Really

L'apostrophe double est intentionnelle.

J'ai besoin de convertir la valeur en cas de phrase, à l'exception des mots "ici" et "vraiment" qui sont corrects et doivent rester en majuscule. Comme vous pouvez le voir, le cas dans la valeur est généralement mélangé pour commencer.

J'y travaille depuis un petit moment. Tout ce que j'ai jusqu'à présent, c'est:

 (. )([A-Z])(.+)

qui semble au moins sélectionner les chaînes appropriées. La pièce de remplacement est l'endroit où je lutte.

40
jkramp

Le remplacement d'expression régulière ne peut pas exécuter de fonction (comme la capitalisation) sur les correspondances. Vous devez écrire cela, par exemple dans PHP ou JavaScript.

Mise à jour: Voir réponse de Jonas .

Je me suis construit une page Web appelée Text Utilities pour faire ce genre de choses:

  • collez votre texte
  • allez dans "Rechercher, regexp & remplacer" (ou appuyez sur Ctrl+Shift+F)
  • entrez votre expression régulière (la mienne serait ^(.*?\=\s*\w)(.*)$)
  • cochez l'option "^ $ match line limits"
  • choisissez "Appliquer la fonction JS aux correspondances"
  • ajouter des arguments (d'abord la correspondance, puis des sous-modèles), ici s, start, rest
  • changer l'instruction de retour en return start + rest.toLowerCase();

La fonction finale dans la zone de texte ressemble à ceci:

return function (s, start, rest) {
     return start + rest.toLowerCase();
};

Peut-être ajouter du code pour mettre en majuscule certains mots comme "Vraiment" et "Ici".

13
instanceof me
Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3

Dans Notepad ++ 6.0 ou mieux (qui est fourni avec PCRE support).

158
Jonas Byström

Dans Notepad ++, vous pouvez utiliser un plugin appelé PythonScript pour faire le travail. Si vous installez le plugin, créez un nouveau script comme ceci:

enter image description here

Ensuite, vous pouvez utiliser le script suivant, en remplaçant les variables d'expression rationnelle et de fonction comme bon vous semble:

import re

#change these
regex = r"[a-z]+sym"
function = str.upper

def perLine(line, num, total):
for match in re.finditer(regex, line):
    if match:
        s, e = match.start(), match.end()
        line = line[:s] + function(line[s:e]) + line[e:]
        editor.replaceWholeLine(num, line)

editor.forEachLine(perLine)

Cet exemple particulier fonctionne en recherchant toutes les correspondances dans une ligne particulière, puis en appliquant la fonction à chaque correspondance. Si vous avez besoin d'une prise en charge multiligne, le script Python "Conext-Help" explique toutes les fonctions proposées, y compris les fonctions pymlsearch/pymlreplace définies sous l'objet 'editor'.

Lorsque vous êtes prêt à exécuter votre script, accédez d'abord au fichier sur lequel vous souhaitez qu'il s'exécute, puis accédez à "Scripts>" dans le menu Script Python Script et exécutez le vôtre.

Remarque: bien que vous puissiez probablement utiliser la fonctionnalité d'annulation de notepad ++ si vous vous trompez, ce pourrait être une bonne idée de mettre le texte dans un autre fichier en premier pour vérifier que cela fonctionne.

P.S. Vous pouvez 'trouver' et 'marquer' chaque occurrence d'une expression régulière en utilisant la boîte de dialogue de recherche intégrée de notepad ++, et si vous pouviez les sélectionner toutes, vous pourriez utiliser la fonctionnalité "Caractères-> MAJUSCULES" de TextFX pour ce problème particulier, mais je ' Je ne sais pas comment passer du texte marqué ou trouvé au texte sélectionné. Mais, je pensais que je publierais ceci au cas où quelqu'un le ferait ...

Modifier: Dans Notepad ++ 6.0 ou supérieur, vous pouvez utiliser "Recherche/remplacement PCRE (expression régulière compatible Perl)" (source: http: //sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions ) Cela aurait donc pu être résolu en utilisant une expression régulière comme (. )([A-z])(.+) avec un argument de remplacement comme \1\U\2\3.

6
atomictom

L'intervenant avait un cas très précis à l'esprit. En tant que "changement général de cas de phrase" dans notepad ++, la première suggestion d'expression régulière ne fonctionnait pas correctement pour moi. bien que pas parfait, voici une version modifiée qui était une grande amélioration par rapport à l'original à mes fins:

find:    ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3

Vous avez toujours un problème avec les noms en minuscules, les noms, les dates, les pays, etc., mais un bon correcteur orthographique peut vous aider.

3
hedgehog