2009-06-17 23 views
4

Erstens bin ich hier in C#, das ist der Geschmack von RegEx, mit dem ich es zu tun habe. Und hier sind, was Dinge, die ich passen zu:Regulärer Ausdruck zum Vergleichen von Zahlen innerhalb von Klammern in eckigen Klammern mit optionalem Text

[(1)] 

oder

[(34) Some Text - Some Other Text] 

Also im Grunde muss ich wissen, ob das, was zwischen den Klammern ist numerisch ist und ignorieren alles zwischen der geschlossenen Klammer und schließen Sie die eckige Klammer. Irgendwelche RegEx Gurus kümmern sich um Hilfe?

+0

Können Sie bitte klären? –

Antwort

15

Dies sollte funktionieren:

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

Und wenn Sie die Zahl fangen müssen, einfach \d+ in Klammern wickeln:

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

Etwas wie:

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

Möglicherweise mit einigen mehr Entkommen erforderlich?

1

Müssen Sie die []? Können Sie einfach ...

\((\d+)\) 

(Die Zahlen selbst werden in den Gruppen sein).

Zum Beispiel ...

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

Wie sei es "^ \ [\ ((d +) \)" (Perl-Stil, nicht vertraut mit C#). Sie können den Rest der Linie sicher ignorieren, denke ich.

0

Je nachdem, was Sie erreichen wollen ...

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

Wie ist das? Angenommen, Sie müssen nur bestimmen, wenn die Zeichenfolge eine Übereinstimmung vorliegt, und muss nicht den numerischen Wert extrahieren ...

 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 scheint übertrieben in dieser Situation. Hier ist die Lösung, die ich am Ende benutzt habe.

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