2009-06-17 9 views
4

Premièrement, je suis en C# ici, donc c'est la saveur de RegEx que j'ai affaire. Et voici les choses que je dois pouvoir faire correspondre:Expression régulière pour faire correspondre les nombres entre parenthèses entre crochets avec le texte optionnel

[(1)] 

ou

[(34) Some Text - Some Other Text] 

Donc, fondamentalement, je dois savoir si ce qui est entre les parenthèses est numérique et ignorer tout entre la parenthèse fermante et fermer le crochet carré. Tous les gourous RegEx veulent vous aider?

+0

Pouvez-vous clarifier s'il vous plaît? –

Répondre

15

Cela devrait fonctionner:

\[\(\d+\).*?\] 

Et si vous devez prendre le numéro, il suffit d'envelopper \d+ entre parenthèses:

\[\((\d+)\).*?\] 
0

Quelque chose comme:

\[\(\d+\)[^\]]*\] 

Peut-être avec un peu plus d'échappement nécessaire?

1

Est-ce que vous devez faire correspondre le []? Pouvez-vous faire juste ...

\((\d+)\) 

(Les nombres eux-mêmes seront dans les groupes).

Par exemple ...

var mg = Regex.Match("[(34) Some Text - Some Other Text]", @"\((\d+)\)"); 

if (mg.Success) 
{ 
    var num = mg.Groups[1].Value; // num == 34 
} 
    else 
{ 
    // No match 
} 
0

Que diriez-vous "^ \ [\ ((d +) \)" (style perl, pas familier avec C#). Vous pouvez sans risque ignorer le reste de la ligne, je pense.

0

Selon ce que vous essayez d'accomplir ...

List<Boolean> rslt; 
String searchIn; 
Regex regxObj; 
MatchCollection mtchObj; 
Int32 mtchGrp; 

searchIn = @"[(34) Some Text - Some Other Text] [(1)]"; 

regxObj = new Regex(@"\[\(([^\)]+)\)[^\]]*\]"); 

mtchObj = regxObj.Matches(searchIn); 

if (mtchObj.Count > 0) 
    rslt = new List<bool>(mtchObj.Count); 
else 
    rslt = new List<bool>(); 

foreach (Match crntMtch in mtchObj) 
{ 
    if (Int32.TryParse(crntMtch.Value, out mtchGrp)) 
    { 
     rslt.Add(true); 
    } 
} 
0

Comment ce? En supposant que vous ne devez déterminer si la chaîne est un match, et n'a pas besoin d'extraire la valeur numérique ...

 string test = "[(34) Some Text - Some Other Text]"; 

     Regex regex = new Regex("\\[\\(\\d+\\).*\\]"); 

     Match match = regex.Match(test); 

     Console.WriteLine("{0}\t{1}", test, match.Success); 
0

Regex semble exagéré dans cette situation. Voici la solution que j'ai fini par utiliser.

var src = test.IndexOf('(') + 1; 
var dst = test.IndexOf(')') - 1; 
var result = test.SubString(src, dst-src); 
Questions connexes