2009-03-26 5 views
0

Je dispose d'un fichier texte qui contiennent tous les fragments de code suivant dans ceComment contrôler le regroupement Regex?

Lines.Strings = (
    '[email protected]' 
    '[email protected]' 
    '[email protected]' 
    '[email protected]') 

l'adresse e-mail changera. comme le fait la ligne Lines.String il peut être appelé quoi que ce soit EG Test.Strings, ou ListBox.Strings

Je veux faire correspondre tout et n'importe quel texte à l'intérieur de ce bloc Strings =();

ici est le code que je utilise

[a-zA-Z]+\.Strings\s+=\s+[\(]{1}(.+)[\)]{1} 

mais cela n'attrape pas tous les matchs

Je veux que le groupement d'arrêter après la première) se trouve. on dirait qu'il correspond à n'importe quel caractère après le premier (et tout le chemin jusqu'à la fin du fichier jusqu'au dernier)

toute aide serait grandement appréciée.

EDIT:

Je ne demande pas de faire correspondre "emails"; Je veux un texte entre l'ouverture (et la fermeture)

Je pense que c'est ce qu'on appelle une correspondance "non gourmande". je veux seulement que le match se termine après le premier) est trouvé.

+0

La validation de l'adresse e-mail est un problème complexe. Voici une discussion intéressante sur la performance de plusieurs options: http://fightingforalostcause.net/misc/2006/compare-email-regex.php – bernie

+0

a ajusté ma question. merci –

+0

Excuses, j'ai mal compris, supprimé ma réponse. –

Répondre

3

Cela peut fonctionner mieux.

[a-zA-Z]+\.Strings\s*=\s*\(([^)])+)\) 

De même, comment gérez-vous les sauts de ligne? C'est peut-être votre problème. De l'expression rationnelle que vous avez donnée, il semble que vous concaténiez toutes les lignes avec des espaces. Sinon, vous devez penser en termes d'expressions régulières multi-lignes.

En réponse à votre réponse à votre question:

"[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?", 

est inutilement encombré, et peut ne pas fonctionner comme prévu pour plusieurs cas.

  • vous n'avez pas besoin d'écrire {1} puisque c'est la valeur par défaut
  • [\)] est le même que celui que \)
  • vous ne correspondront pas les cas où le = n'est pas entouré par des espaces, même si une telle les espaces sont généralement facultatifs
  • Rendre le ) final facultatif et ne pas exclure ) de votre motif interne signifie qu'il fera partie de votre capture.

Fixation ces conduit à:

"[a-zA-Z]+\\.Strings\\s*=\\s*\\(([^)]+)\\)" 

Ce qui est exactement ce que j'ai posté, mais avec les anti-slash pour une utilisation dans doublais une chaîne.

+0

J'utilise le "SingleLine" RegexOption –

+0

Ensuite, vous aurez besoin de coller toutes les lignes ensemble dans une longue ligne (avec des espaces entre eux) pour correspondre à des cas multilignes comme votre exemple. – MarkusQ

+0

Merci pour l'aide! +1 et accepté –

1

Essayez

/\(([^\)]+)\)/ 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    \(      '(' 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [^\)]+?     any character except: '\)' (1 or more 
          times (matching the least amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
0
public static Regex regex = new Regex(
     "[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?", 
    RegexOptions.IgnoreCase 
    | RegexOptions.Singleline 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

Il me semble avoir obtenu ce.

Si vous pouvez améliorer cela; postez votre propre réponse avec la version mise à jour.

- Note - les travaux ci-dessus.

+0

Vous l'avez compris, mais vous faites beaucoup de choses inutiles; voir ma réponse pour plus de détails. – MarkusQ

Questions connexes