Я пытаюсь разделить числа с признаками из текста. Я использую Regex. Например, у меня есть это уравнение:
12X -3 У <= -6
В приведенном ниже коде вы можете увидеть, что я сделал:
string[] numOfConstraint = Regex.Split(richTextBox2.Text, @"\D+");
но этот код разделяет числа только на другие символы. то есть:
12 3 6
Я хочу, чтобы эти цифры со знаками.
12 -3 -6
Вы можете попробовать что-то вроде этого:
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
)? #
Я думаю, вы довольно близки, просто используйте \d
вместо \D
, захватите -
и используйте Regex.Match вместо split:
(-?\d+)
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());
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);
}
Не самый красивый, но он должен работать.