2010-03-16 3 views
1

Мне нужен простой способ проверить строку, отправляется в моей функции, является ли вид:Формат строки или REGEX

(x + n)(x + m) 
//the +'s can be minus' 
//n and m represent a double 
//x represents the char 'x' 

Есть простой формат строки, которые я могу использовать, чтобы проверить, что это форма. В отличие от проверки каждого символа сингулярно.

Пробелы будут удалены, чтобы сохранить путаницу.

С уважением

Lloyd

+1

Почему не существует регулярное выражение? –

+2

Держу пари, что его профессор не будет принимать регулярное выражение в качестве решения, если только урок не содержит регулярное выражение. –

+0

Regex был изначально, на что я смотрел. Но мне было интересно, есть ли простой способ проверить '(' 'x' значение оператора ')' последовательно. – ThePower

ответ

4

Вот колото на RegEx примере ...

var pattern = @"^(\(x[+-]\d+(\.\d+)?\)){2}$"; 
var input = "(x-0.123)(x+5)"; 
var result = System.Text.RegularExpressions.Regex.IsMatch(input, pattern); 

if (result) { 
    Console.Write("YAY IT MATCHES"); 
} 
+0

Спасибо. Я просто не могу придумать регулярное выражение! Оценил. – ThePower

+0

Regex очень запутанно. Я использую http://regexpal.com/, чтобы поиграть с ними, пока что-то не сработает. У них есть удобная быстрая ссылка на странице. – jessegavin

+0

Регулярные выражения являются одним из наиболее мощных элементов в панели инструментов разработчика, но они могут быть больны для изучения с использованием скомпилированного языка. Они действительно нажали на меня в python, потому что я мог делать что-то из интерпретатора python и быстро пробовать. – marr75

1

REGEX

Используйте это, и вы не будете иметь 2 проблемы;!)

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(IsGood1("+x(3)-)x-5+")); 
      Console.WriteLine(IsGood1("(x * n)(x + m)")); 
      Console.WriteLine(IsGood1(" (x + 12.9) (x+33.9)")); 
     } 

     private static bool IsOrdered(string s) // bad idea 
     { 
      var ind = new List<int>(); 
      ind.Add(s.IndexOf('(')); 
      ind.Add(s.IndexOfAny(new char[] { '+', '-' })); 
      ind.Add(s.IndexOf(')')); 
      ind.Add(s.LastIndexOf('(')); 
      ind.Add(s.LastIndexOfAny(new char[] { '+', '-' })); 
      ind.Add(s.LastIndexOf(')')); 

      bool order = true; 

      for (int i = 0; i < ind.Count - 1; i++) 
      { 
       order = order && (ind[i] < ind[i + 1]); 
      } 
      return order; 
     } 

     public static bool IsGood1(string s) 
     { 
      if (!IsOrdered(s)) return false; 

      double m = 0; 
      int c = 0; 

      foreach (var item in s.Split(new char[] { '+', '-', '(', ')' })) 
      { 
       var xx = item.Trim(); 

       if (xx != "") 
        switch (c) 
        { 
         case 0: 
         case 2: 
          if (xx == "x") c++; 
          break; 
         case 1: 
         case 3: 
          if (double.TryParse(xx, out m)) c++; 
          break; 
        } 
      } 

      return c == 4; 
     } 

    } 
+2

не будет принимать '+ x (3) -) x-5 +' и все остальные комбинации '[- +()]'? – Kobi

+0

+1 Kobi Спасибо! Позаботился об этом, но теперь он выглядит грязным! вы знаете какой-то лучший способ? Не стесняйтесь редактировать мой ответ :) –

1

Это случай, когда я считаю, что регулярные выражения имеют большой смысл. В отличие от C++, C# не имеет способа (что я знаю) использовать форматирование строк как часть синтаксического анализа строки.

Quoting Eric Lippert:

Это умный? Прекрасно? № Короткие? Нет. Исправить в соответствии со спецификацией ?

Надеюсь, что так, но я не полностью его протестировал. Это выглядит довольно неплохо.

static bool testJoin(string x) 
    { 
     string[] s = x.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     if (s.Length != 3) return false; 
     if (s[1] != "+" && s[1] != "-") return false; 
     if (s[0] != "x") return false; 
     double tmp; 
     return Double.TryParse(s[2], out tmp); 
    } 
    static bool testString(string x) 
    { 
     if (x.Length < 2) return false; 
     if (x[0] != '(' || x[x.Length-1]!=')') return false; 
     string[] y = x.Substring(1,x.Length-2).Split(new string[] { ")(" }, StringSplitOptions.None); 
     if (y.Length != 2) return false; 
     return testJoin(y[0]) && testJoin(y[1]); 
    } 
+0

Обратите внимание, что наши спецификации могут не совпадать. Например, я должен иметь одно или несколько пробелов до и после +/-. – Brian

+0

Для тех, кто этого не понял, моя ссылка на Эрика Липперта была шуткой, поскольку его контекст был «давайте сделаем все правильно, даже если это не очень», и мой контекст: «Это некрасиво. " – Brian

Смежные вопросы