2009-07-02 8 views
0

Je veux faire correspondre le motif: Commence par 0 ou plusieurs espaces, suivi de "ABC", suivi de tout.Comment construire ceci en expression rationnelle

Donc des choses comme " ABC " " ABC111111" "ABC" seraient trouvées. Les choses comme " AABC" "SABC" ne correspondraient pas.

J'ai essayé:

String Pattern = "^\\s*ABC(.*)"; 

Mais il ne fonctionne pas.

Des idées? C'est en C# au fait.

+1

Votre modèle regarde droit à moi. Êtes-vous sûr que cela ne fonctionne pas? –

+1

Oui, ce modèle fonctionne également pour moi - il y a peut-être une erreur dans votre code C#. Seriez-vous en mesure de publier le code aussi? –

Répondre

1

Le \\ place généralement une barre oblique inverse littérale, ce qui explique probablement l'échec de votre solution. À moins que vous faites remplacer vous ne avez pas besoin des parenthèses autour de la .*

personnages aussi \s matches en plus le caractère d'espace [ \t\n\f\r\x0B] ou dans l'espace, tabulation, nouvelle ligne, formfeed, retour, et Vertical Tab.

je suggère:

String Pattern = @"^[ ]*ABC.*$"; 
+0

C# vous oblige à échapper les barres obliques inverses dans les expressions régulières comme ça. – Tom

+0

Que fait l'ajout de @ devant le motif? – Saobi

+0

@Saobi - Un littéral textuel verbatim se compose d'un caractère @ suivi d'un guillemet, de zéro caractère ou plus et d'un guillemet fermant. Un exemple simple est @ "bonjour". Dans un littéral littéral verbatim, les caractères entre les délimiteurs sont interprétés textuellement, la seule exception étant une séquence d'échappement de citation. En particulier, les séquences d'échappement simples et les séquences d'échappement hexadécimales et Unicode ne sont pas traitées dans les littéraux textuels textuels. De http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx – JeffH

2

Essayez

string pattern = @"\s*ABC(.*)"; // Using @ makes it easier to read regex. 

J'ai vérifié que cela fonctionne sur regexpl.com

+0

Le^ne force-t-il pas l'examen du début de la ligne? –

+0

Le signe^signifie que le motif commence au début de la ligne. – Kleinux

0

Vérifiez que vous avez mis le moteur regex utiliser SingleLine et non multiligne.

1

J'ai testé cela. Ça marche. Vous pouvez omettre RegexOptions.IgnoreCase si vous souhaitez que seules les majuscules ABC soient associées.

/// <summary> 
/// Gets the part of the string after ABC 
/// </summary> 
/// <param name="input">Input string</param> 
/// <param name="output">Contains the string after ABC</param> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetStringAfterABC(string input, out string output) 
{ 
    output = null; 

    string pattern = "^\\s*ABC(?<rest>.*)"; 

    if (Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase)) 
    { 
     Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
     output = r.Match(input).Result("${rest}"); 
     return true; 
    } 
    else 
     return false; 
} 

Indicatif téléphonique:

static void Main(string[] args) 
{ 
    string input = Console.ReadLine(); 

    while (input != "Q") 
    { 
     string output; 
     if (MyRegEx.TryGetStringAfterABC(input, out output)) 
      Console.WriteLine("Output: " + output); 
     else 
      Console.WriteLine("No match"); 
     input = Console.ReadLine(); 
    } 
} 
Questions connexes