Как я должен получить комплексные числа из строки? - PullRequest
1 голос
/ 21 октября 2010

Я нашел следующий шаблон из RegexLibrary , и я не знаю, как использовать Match для получения значений Re и Im. Я новичок в Regex. Это правильный способ получить данные из шаблона? Если это правда, мне нужен пример кода! Вот что я думаю должно быть:

public static complex Parse(string s)
{
    string pattern = @"([-+]?(\d+\.?\d*|\d*\.?\d+)([Ee][-+]?[0-2]?\d{1,2})?[r]?|[-+]?((\d+\.?\d*|\d*\.?\d+)([Ee][-+]?[0-2]?\d{1,2})?)?[i]|[-+]?(\d+\.?\d*|\d*\.?\d+)([Ee][-+]?[0-2]?\d{1,2})?[r]?[-+]((\d+\.?\d*|\d*\.?\d+)([Ee][-+]?[0-2]?\d{1,2})?)?[i])";
    Match res = Regex.Match(s, pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);        

    // What should i do here? The complex number constructor is complex(double Re, double Im);

    // on error...
    return complex.Zero;
}

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

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

Попробуйте использовать это простое регулярное выражение.

class Program
{
    static void Main(string[] args)
    {
        // The pattern has been broken down for educational purposes
        string regexPattern =
            // Match any float, negative or positive, group it
            @"([-+]?\d+\.?\d*|[-+]?\d*\.?\d+)" +
            // ... possibly following that with whitespace
            @"\s*" +
            // ... followed by a plus
            @"\+" +
            // and possibly more whitespace:
            @"\s*" +
            // Match any other float, and save it
            @"([-+]?\d+\.?\d*|[-+]?\d*\.?\d+)" +
            // ... followed by 'i'
            @"i";
        Regex regex = new Regex(regexPattern);

        Console.WriteLine("Regex used: " + regex);

        while (true)
        {
            Console.WriteLine("Write a number: ");
            string imgNumber = Console.ReadLine();
            Match match = regex.Match(imgNumber);

            double real = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
            double img = double.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture);
            Console.WriteLine("RealPart={0};Imaginary part={1}", real, img);
        }                       
    }
}

Не забудьте попытаться понять все регулярные выражения, которые вы используете, никогда не используйте их вслепую.Их нужно понимать как любой другой язык.

1 голос
/ 19 мая 2011

Это был мой взгляд на Visual Basic .NET 4:

 

   Private Function GenerateComplexNumberFromString(ByVal input As String) As Complex </p>

<pre><code> Dim Real As String = “(?<!([E][+-][0-9]+))([-]?\d+\.?\d*([E][+-][0-9]+)" & _
 "?(?!([i0-9.E]))|[-]?\d*\.?\d+([E][+-][0-9]+)?)(?![i0-9.E])”

 Dim Img As String = “(?<!([E][+-][0-9]+))([-]?\d+\.?\d*([E][+-][0-9]+)?" & _ 
 "(?![0-9.E])(?:i)|([-]?\d*\.?\d+)?([E][+-][0-9]+)?\s*(?:i)(?![0-9.E]))” 

 Dim Number As String = “((?<Real>(” & Real & “))|(?<Imag>(” & Img & “)))”
 Dim Re, Im As Double
 Re = 0
 Im = 0

  For Each Match As Match In Regex.Matches(input, Number)

      If Not Match.Groups(“Real”).Value = String.Empty Then
         Re = Double.Parse(Match.Groups(“Real”).Value, CultureInfo.InvariantCulture)
      End If

     If Not Match.Groups(“Imag”).Value = String.Empty Then
           If Match.Groups(“Imag”).Value.ToString.Replace(” “, “”) = “-i” Then
                  Im = Double.Parse(“-1″, CultureInfo.InvariantCulture)
           ElseIf Match.Groups(“Imag”).Value.ToString.Replace(” “, “”) = “i” Then
                  Im = Double.Parse(“1″, CultureInfo.InvariantCulture)
           Else
                  Im = Double.Parse(Match.Groups(“Imag”).Value.ToString.Replace(“i”, “”), CultureInfo.InvariantCulture)
  End If
  End If
 Next

     Dim result As New Complex(Re, Im)
      Return result
     End Function

1 голос
/ 21 октября 2010

Вам необходимо получить 2 Capture объектов из Match и вызвать Double.Parse для их значений.

Кстати, обратите внимание, что вы должны использовать объект static readonly Regex, чтобы не нужно было повторно анализировать шаблон каждый раз, когда вы вызываете Parse. Это заставит ваш код работать намного быстрее.

...