Как разбить номер со своими знаками из текста

1

Я пытаюсь разделить числа с признаками из текста. Я использую Regex. Например, у меня есть это уравнение:

12X -3 У <= -6

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

string[] numOfConstraint = Regex.Split(richTextBox2.Text, @"\D+");

но этот код разделяет числа только на другие символы. то есть:

12 3 6

Я хочу, чтобы эти цифры со знаками.

12 -3 -6

  • 0
    Чего ты хочешь добиться?
Теги:

3 ответа

1

Вы можете попробовать что-то вроде этого:

string text = @"12x-3y<=-6" ;
Regex rx = new Regex( @"-?\d+(\.\d+)?([Ee][+-]?\d+)?") ;
string[] words = rx
                 .Matches(text)
                 .Cast<Match>()
                 .Select( m => m.Value )
                 .ToArray()
                 ;

который дает

words[0] = "12
words[2] = "-3"
words[4] = "-6"

Легко!

Регулярное выражение должно соответствовать любому базовому буквалу. Его можно разбить следующим образом:

-?              # an optional minus sign, followed by
\d+             # 1 or more decimal digits, followed by
(               # an optional fractional component, consisting of
  \.            # - a decimal point, followed by
  \d+           # - 1 or more decimal digits.
)?              # followed by
(               # an optional exponent, consisting of
  [Ee]          # - the letter "E" , followed by
  [+-]?         # - an optional positive or negative sign, followed by
  \d+           # - 1 or more decimal digits
)?              #
1

Я думаю, вы довольно близки, просто используйте \d вместо \D, захватите - и используйте Regex.Match вместо split:

(-?\d+)

Изображение 174551

Применение

var match = Regex.Match(pattern, input);
if (match.Success)
{
    foreach (var g in match.Captures)
    {

    }
}

Вы можете объединить эти Captures следующим образом:

var s = string.Join(" ", match.Captures
    .Select(c => c.Value)
    .ToArray());

Демоверсия Debuggex

0
List<string> strList = new List<string>();
List<float> fltList = new List<float>();
 StringBuilder sb = new StringBuilder();
 for(int i = 0; i < richTextBox.Text.Length; i++)
 {
  if(!char.IsDigit(richTextBox.Text[i]) && richTextBox.Text[i] != "-")
       {
        if(sb.ToString().Length > 0)
            strList.Add(sb.ToString());

        sb.Clear();
       }
   else
       sb.Add(richTextBox.Text[i]);
   }

  float numOut;
  foreach(string num in strList)
  {
    if( float.TryParse(num, out numOut) )
        fltList.Add(numOut);
  }

Не самый красивый, но он должен работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню