2016-07-22 4 views
1

Ich habe die nächste regex:Wie soll ich eine Regex schreiben, um eine Zeichenfolge mit Zahlen und einem bestimmten Wort zu vergleichen?

^\s*(\d+(\s*,\s*\d+)*)?\s*$ 

, die die nächste Zeichenfolge entspricht:

"1, 2, 3"

Ich brauche es zu modifizieren, um die nächste Zeichenfolge übereinstimmen (s) mit einem bestimmten Wort (Fall ignorieren):

"1, mein Wort, 3"

"myWord, 2, 3"

"1, myWord, 3, myWord"

Wie kann ich zusätzliche Prüfgruppe hinzufügen?

Upd: myWord ist optional, kann mehrmals wiederholen oder zu Beginn eines Strings sein.

+2

Ersetzen Sie beide '\ d +' 'mit (?: \ D + | myWord)'. Siehe ['^ \ s * ((?: \ D + | myword) (\ s *, \ s * (?: \ D + | mein Wort)) *)? \ S * $'] (http://regexstorm.net/tester? p =% 5e% 5cs * ((% 3f% 3a% 5cd% 2b% 7cmyword) (% 5cs *% 2c% 5cs * (% 3f% 3a% 5cd% 2b% 7cmyword)) *)% 3f% 5cs *% 24 & i = 1% 2c + 2% 2c + 3% 0d% 0a1% 2c + mein Wort% 2c + 3% 0d% 0amyword% 2c + 2% 2c + 3% 0d% 0a1% 2c + mein Wort% 2c + 3 % 2c + myword% 0d% 0a & o = m). –

+0

@ WiktorStribiżew Großartig! Danke vielmals! – user3132547

+0

https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx und schauen Sie sich die Option count an. 0, könnte Ihre Zählung sein, da es optional ist. Nicht jedes Problem ist eine Regex.Wenn du ein wenig Code schreibst, kann das deine Absicht deutlicher machen als der, der hinter dir her kommt und es pflegen muss. –

Antwort

1

können Sie beide \d+ mit (?:\d+|myword) ersetzen. Werfen Sie einen Blick auf den Alternation with The Vertical Bar or Pipe Symbol:

Wenn Sie den wörtlichen Text suchen mögen cat oder dog, trennen beiden Optionen mit einem vertikalen Balken oder Pipe-Symbol: cat|dog. Wenn Sie weitere Optionen wünschen, erweitern Sie einfach die Liste: cat|dog|mouse|fish.

die Regex-Engine zu sagen, dass wir nur die \d+ Ziffern und myword, wir schließen Sie sie nur für die Zwecke hier Gruppierung verwendet innerhalb eines non-capturing group wollen abzuwechseln.

Siehe

^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$ 

die regex demo See.

MyWoRd Fall Passend, insensitively RegexOptions.IgnoreCase Flag verwenden, wenn das Objekt Regex kompilieren oder das gesamte Muster prepend mit (?i)inline Modifikator (d.h. (?i)^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$). Hier

ist die C# demo:

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    public static void Main() 
    { 
     var inputs = new string[] { "1, 2, 3", "1, myword, 3", "1, MyWord, 3" }; 
     var pat = @"^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$"; 
     foreach (var s in inputs) 
      Console.WriteLine("{0} matched: {1}", s, Regex.IsMatch(s, pat, RegexOptions.IgnoreCase)); 
    } 

} 
+0

und wie mache ich die Groß- und Kleinschreibung nicht beachten? "Myword" verwenden? – user3132547

+0

Verwenden Sie das 'RegexOptions.IgnoreCase' Flag, oder stellen Sie das gesamte Muster mit' (? I) 'voran. –

1

Um zu beginnen, kann Ihre ursprüngliche Regex bis hinunter zu ^\s*(\d+\s*,\s*)*\d+$ vereinfacht werden, die, um mit Ihrer gewünschten Erweiterung umzugehen, zu geändert werden kann.

+0

Was ist, wenn mein Wort am Anfang steht? Und wenn mein Wort optional ist? – user3132547

+0

'(a | b)' in einer Regex bedeutet, entweder "a" oder "b" an der gleichen Stelle im Text zu finden. In diesem Fall ist "Mein Wort" vollständig optional und kann am Anfang oder Ende oder irgendwo dazwischen erscheinen. –

Verwandte Themen