2010-03-02 7 views
1

Y at-il une expression régulière que je pourrais utiliser dans la recherche/Remplacer fonction de mon éditeur de texte (Jedit) pour effectuer les opérations suivantes:Expression régulière pour envelopper des lignes correspondant à l'intérieur dièses, mais pas les espaces au

match des lignes un fichier texte qui répondent à ces critères:

  1. la ligne se termine par une parenthèse fermante
  2. une parenthèse ouvrante existe quelque part sur la même ligne

Si cela correspond je dois envelopper tout le texte sur la ligne - mais pas d'espace au début de la ligne - à l'intérieur des signes #.

Exemple 1

Cette ligne:

Total reimbursements (before end of Q1) 

doit être remplacé par ceci:

#Total reimbursements (before end of Q1)# 

Exemple 2 (premier espace)

Cette ligne (où il y a des espaces avant le mot Total):

       Total reimbursements (before end of Q1) 

doit être remplacé par ce (le signe # est placé avant la première lettre sur la ligne):

       #Total reimbursements (before end of Q1)# 

mais pas avec ceci:

#        Total reimbursements (before end of Q1)# 

fichier texte Exemple:

Base Expenses 
&&&&&&&&&&&&&&&&&&&&&&& 


Provides options towards multilateral improvements 

Opening Debt(Option patterns) 
      A copy provided externally 

Customer Summary 
&&&&&&&&&&&&&&&&&&&&&&&&& 

External Console(foreign debt) 
      Provide execution amounts 
Internal Console(domestic debt) 
      Release to appropriations committee 

Explanations provided to external clients 

Neutralized Amounts() 
      Forex portion 

Répondre

2

Regex:

^([ \t]*)(.*\(.*\))$

remplacement:

$1#$2#

La chose est plus délicate en vous assurant qu'aucune partie de l'expression régulière peut correspondre à des sauts de ligne. C'est pourquoi j'ai utilisé [ \t]* au lieu de \s* et .* au lieu de [^(]* ou [^)]*.

+0

C'est la seule solution ici qui a fonctionné sans faille contre tous mes fichiers de test. Merci beaucoup!! – Bowe

2

Je l'ai fait:

regex = /^(\s*)(.*)\((.*)\)$/ 

et imprimé 1 # $ 2 $ (3 $) # sur un match.

+0

Cela n'a eu aucun effet sur mon fichier texte. – Bowe

+0

il a besoin de drapeaux globaux et multilignes/^(\s*)(.*)(((**)\)$/gm global -> obtenir tous les matchs; multiline -> '^' représente le début de la ligne (pas le début de la chaîne) et '$' la fin de la ligne (pas la fin de la chaîne) – Biroka

+0

@Biroka: le mode multiligne est généralement utilisé par défaut dans un éditeur de texte. est obtenu en cliquant sur 'Replace All' au lieu de 'Replace'. @Bowe: avez-vous supprimé les barres obliques aux extrémités? –

1

MISE À JOUR:

Ok, [^(]+ à jEdit drapeau par défaut regex, mangé \n aussi (je ne vois pas d'options pour mettre l'indicateur multiligne dans jEdit rechercher/remplacer l'interface utilisateur),

Ainsi, voici un nouveau, confirmé avec votre texte mis à jour

Recherche: ^(\s*)([^(\n]+\([^)\n]*\))\s*$
Remplacer: $1#$2

--- réponse précédente ---

Jedit,

Recherche: ^(\s*)([^(]+\([^)]+\))\s*$
Remplacer: $1#$2

--- précédente réponse précédente ---

Python, '^(\s*)([^(]+\([^)]+\))\s*$'

>>> import re 
>>> 
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','Total reimbursements (before end of Q1)') 
'#Total reimbursements (before end of Q1)' 
>>> 
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','        Total reimbursements (before end of Q1)') 
'        #Total reimbursements (before end of Q1)' 
  • en supposant qu'il n'y a qu'un seul support dans la ligne
  • \s* à la fin ne serait pas nécessaire, s'il y a des espaces de fin
  • vous auriez probablement besoin re.MULTILINE drapeau aussi, si vous voulez traiter plusieurs lignes en un seul coup.
+0

Essayé sur un échantillon où il n'y a pas de texte entre les parenthèses et il n'a eu aucun effet là. Sur un échantillon différent où il y a du texte entre les parenthèses, il place le signe dièse plus tôt dans le fichier plutôt que sur la même ligne où la correspondance a eu lieu. – Bowe

+0

Pour faire correspondre '()', changer '[^)] +' '[^)]' 'fonctionnerait – YOU

+0

Merci pour la capture d'écran. Ce sont les paramètres que j'utilise aussi. Cela ne semble pas fonctionner sur mes fichiers de test. – Bowe

0

les opérations suivantes:

^\s*(?=((.*)(?<=\((.*)\))$))|(?<=\((.*)\))$ 

Il regarde vers l'avenir et derrière les lignes pour correspondre avec un support de fermeture à la fin de la ligne que si elle est précédée par un support d'ouverture. Remplacer avec un hachage vous donnera la sortie désirée, il va également supprimer les espaces au début de la ligne, ne pas vouloir si c'est votre but désiré mais semble le plus probable.

+0

J'ai eu cette erreur quand je l'ai couru dans Jedit: java.util.regex.PatternSyntaxException: Le groupe Look-behind n'a pas de longueur maximale évidente près de l'index 23 – Bowe

+0

Oui, c'est une regex invalide en Java, comme c'est le cas dans la plupart des autres saveurs de regex. Cela fonctionne dans EditPadPro, mais comme vous l'avez dit, il supprime les espaces blancs principaux - y compris les lignes vides. –