2013-03-19 3 views
2

Я хочу использовать Regex для поиска совпадений в строке. Есть и другие способы найти шаблон, который я ищу, но меня интересует решение Regex.Строка не в регулярном выражении

рассмотривать эти строки

"ABC123" 
"ABC245" 
"ABC435" 
"ABC Oh say can You see" 

Я хочу, чтобы соответствовать находке "ABC", за которой ничего, кроме "123". Какое правильное выражение регулярного выражения?

+6

Что касается вашего вопроса в регулярном выражении, отрицательный lookahead '/ ABC (?! 123) /' http://www.regular-expressions.info/lookaround.html –

+0

Всегда ли ваша строка начинается с «ABC»? – Habib

+1

@ Хабиб: Нет. Его можно было бы разместить где-нибудь. – Morten

ответ

1

Использование negative lookahead:

/ABC(?!123)/ 

Вы можете проверить, есть ли совпадения в строке str с:

Regex.IsMatch(str, "ABC(?!123)") 

Полный пример:

using System; 
using System.Text.RegularExpressions; 

public class Example 
{ 
    public static void Main() 
    { 
     string[] strings = { 
      "ABC123", 
      "ABC245", 
      "ABC435", 
      "ABC Oh say can You see" 
     }; 
     string pattern = "ABC(?!123)"; 
     foreach (string str in strings) 
     { 
      Console.WriteLine(
       "\"{0}\" {1} match.", 
       str, Regex.IsMatch(str, pattern) ? "does" : "does not" 
      ); 
     } 
    } 
} 

Live Demo

Увы, мое Regex выше будет соответствовать ABC, если за ним не последует 123. Если вам необходимо сопоставить хотя бы символ после ABC, который не является 123 (то есть не совпадают с ABC самостоятельно или по окончании строки), вы можете использовать ABC(?!123)., точка гарантирует, что вы согласитесь, по крайней мере, один символ после ABC : demo.

Я считаю, что первое Regex - это то, что вы ищете (до тех пор, пока «ничего» нельзя считать «чем угодно» :P).

0

Альтернатива регулярному выражению, если вы считаете это более удобным в использовании. Только предложение.

List<string> strs = new List<string>() { "ABC123", 
              "ABC245", 
              "ABC435", 
              "NOTABC", 
              "ABC Oh say can You see" 
              }; 
    for (int i = 0; i < strs.Count; i++) 
    { 
    //Set the current string variable 
    string str = strs[i]; 
    //Get the index of "ABC" 
    int index = str.IndexOf("ABC"); 
    //Do you want to remove if ABC doesn't exist? 
    if (index == -1) 
     continue; 
    //Set the index to be the next character from ABC 
    index += 3; 
    //If the index is within the length with 3 extra characters (123) 
    if (index <= str.Length && (index + 3) <= str.Length) 
     if (str.Substring(index, 3) == "123") 
     strs.RemoveAt(i); 
    } 
+0

Извините, но меня интересуют только решения Regex. Отредактировал вопрос, чтобы подчеркнуть это. – Morten

+1

@Morten не проблема :) – LukeHennerley

1

Пробуйте следующий тестовый код. Это должно делать то, что вам требуется

string s1 = "ABC123"; 
string s2 = "we ABC123 weew"; 
string s3 = "ABC435"; 
string s4 = "Can ABC Oh say can You see"; 
List<string> list = new List<string>() { s1, s2, s3, s4 }; 
Regex regex = new Regex(@".*(?<=.*ABC(?!.*123.*)).*"); 
Match m = null; 
foreach (string s in list) 
{ 
    m = regex.Match(s); 
    if (m != null) 
     Console.WriteLine(m.ToString()); 
} 

Выход:

ABC435 
Can ABC Oh say can You see 

Это используется как в 'Negative Lookahead' and a 'Positive Lookbehind'.

Надеюсь, это поможет.

+0

Это ** путь ** слишком сложный. Все, что вам нужно, это '/ ABC (?! 123) /', как сказал Фабрицио в своем [комментарии] (http://stackoverflow.com/questions/15498707/string-not-in-regular-expression#comment21942974_15498707). –

+0

Хороший акцент на пути. – MoonKnight