TheSwamp
Code Red => .NET => Topic started by: SteveK on July 29, 2010, 04:46:53 AM
-
Hi,
I have a string. I need a function that finds the last number in the string and increments it by an integer (parameter) then returns the string again.
I'm sure you can do this with regular expressions but I don't know how.
Example 1: (negative increment)
input string = a3
value to increment = -1
string returned = a2
Example 2: (multiple numbers in the string)
input string = ab12cd34e
value to increment = 2
string returned = ab12cd36e
Example 3: (ignoring decimal places)
input string a1.9b
value to increment = 1
string returned = a1.10b
Programming in C#. Any help is appreciated.
-
Example 2: (multiple numbers in the string)
input string = ab12cd34e
value to increment = 2
string returned = ab12cd36e
Example 3: (ignoring decimal places)
input string a1.9b
value to increment = 1
string returned = a1.10b
Are the numbers limited to a range and subject to rollover, like an odometer? Can't tell from examples 1 and 2. Example 3 suggests not. Let's clarify using a modified example 2.
input string ab12cd98e
value to increment = 2
string returned = ab12cd00e or ab12cd100e ??
Similar question for negative increments. And with negative increments, is 0 a floor or are negative results acceptable?
-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Incr("asdf123", 5));
Console.WriteLine(Incr("asdf555_red123", -7));
Console.Read();
}
static string Incr(string text, int increment)
{
int i = Int32.Parse(new string(text.Reverse().TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray()));
string name = text.Substring(0, text.Length - i.ToString().Length);
return name + (i + increment);
}
}
}
-
Are the numbers limited to a range and subject to rollover, like an odometer? Can't tell from examples 1 and 2. Example 3 suggests not. Let's clarify using a modified example 2.
input string ab12cd98e
value to increment = 2
string returned = ab12cd00e or ab12cd100e ??
Similar question for negative increments. And with negative increments, is 0 a floor or are negative results acceptable?
pkohut, I should have added, range is not limited in positive direction, and assume 0 is floor.
Andrey, I will try your code and let you know.
-
static string Incr(string text, int increment)
{
int i = Int32.Parse(new string(text.Reverse().TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray()));
string name = text.Substring(0, text.Length - i.ToString().Length);
return name + (i + increment);
}
Thanks for the code Andrey. It takes me further along than I was, however I get an error when letters are at the end of my string. The last number can be anywhere in the string, even at the start.
-
Hi,
I have a string. I need a function that finds the last number in the string and increments it by an integer (parameter) then returns the string again.
I'm sure you can do this with regular expressions but I don't know how.
Example 1: (negative increment)
input string = a3
value to increment = -1
string returned = a2
Example 2: (multiple numbers in the string)
input string = ab12cd34e
value to increment = 2
string returned = ab12cd36e
Example 3: (ignoring decimal places)
input string a1.9b
value to increment = 1
string returned = a1.10b
Programming in C#. Any help is appreciated.
Hi Steve
Send me test message on my home address
coz I've lost your e-mail
I have complete project (not finished yet,
but it may helps)
I've used RegularExpression to rebuild sttring
~'J'~
-
Hi Oleg,
You have a complete project? But I'm just after one function! :-)
steve
-
The last number can be anywhere in the string, even at the start.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Incr("asdf123", 5));
Console.WriteLine(Incr("asdf555_red123", -7));
Console.WriteLine(Incr("asdf555_red123dwq", -2));
Console.WriteLine(Incr("543asdf", -7));
Console.WriteLine(Incr("asdf555_red123dwq1", -5));
Console.WriteLine(Incr("rrasdf", 8));
Console.Read();
}
static string Incr(string text, int increment)
{
if (text.Where(n => Char.IsNumber(n)).Count() == 0)
{
Console.WriteLine("string '{0}' not contain of number", text);
return string.Empty;
}
string revText = new string(text.Reverse().ToArray());
string a = new string(revText.TakeWhile(n => !Char.IsNumber(n)).ToArray());
int b = Int32.Parse(new string(revText.Skip(a.Length).TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray())) + increment;
string c = revText.Substring(a.Length + b.ToString().Length);
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(new string(b.ToString().Reverse().ToArray()));
sb.Append(c);
return new string(sb.ToString().Reverse().ToArray());
}
}
}
-
Thank you Hwd, I can deffinately use this.
Cheers! :-)
-
Thank you Hwd, I can deffinately use this.
Cheers! :-)
I will forgive pardons - I have skipped an error for it variant string:
"asdf555_red123dwq00001":
I has rectified an error:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Incr("asdf123", 5));
Console.WriteLine(Incr("asdf555_red123", -7));
Console.WriteLine(Incr("asdf555_red123dwq", -2));
Console.WriteLine(Incr("543asdf", -7));
Console.WriteLine(Incr("asdf555_red123dwq1", -5));
Console.WriteLine(Incr("asdf555_red123dwq00001", -5));//It test add
Console.WriteLine(Incr("rrasdf", 8));
Console.Read();
}
static string Incr(string text, int increment)
{
if (text.Where(n => Char.IsNumber(n)).Count() == 0)
{
Console.WriteLine("string '{0}' not contants of nomber", text);
return string.Empty;
}
string revText = new string(text.Reverse().ToArray());
string a = new string(revText.TakeWhile(n => !Char.IsNumber(n)).ToArray());
string z = new string(revText.Skip(a.Length).TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray());
int b = Int32.Parse(z) + increment;
if (b > 0)
{
z = z.Length == b.ToString().Length ? b.ToString() : new string('0', z.Length - b.ToString().Length) + b;
}
else
{
z = z.Length == b.ToString().Length ? b.ToString() : new string('0', z.Length + 1 - b.ToString().Replace("-","").Length) + Math.Abs(b);
}
string c = revText.Substring(a.Length + z.Length);
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(new string(z.Reverse().ToArray()));
sb.Append(c);
return new string(sb.ToString().Reverse().ToArray());
}
}
}
-
Thanks for your help so far Hwd.
I did find another error though. Try for example:
Console.WriteLine(Incr("9a", 1));
Console.WriteLine(Incr("a99b", 1));
Edit: Also, a problem with having Replace("-","") in the code is that sometimes there are hyphen's in the string and it'd remove them.
-
Thanks for your help so far Hwd.
I did find another error though. Try for example:
Console.WriteLine(Incr("9a", 1));
Console.WriteLine(Incr("a99b", 1));
Edit: Also, a problem with having Replace("-","") in the code is that sometimes there are hyphen's in the string and it'd remove them.
Test it please:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Incr("asdf123", 5));
Console.WriteLine(Incr("asdf555_red123", -7));
Console.WriteLine(Incr("asdf555_red123dwq", -2));
Console.WriteLine(Incr("543asdf", -7));
Console.WriteLine(Incr("asdf555_red123dwq1", -5));
Console.WriteLine(Incr("asdf555_red123dwq00001", -5));
Console.WriteLine(Incr("9a", 1));
Console.WriteLine(Incr("a99b", 1));
Console.WriteLine(Incr("999", -11));
Console.WriteLine(Incr("rrasdf", 8));
Console.Read();
}
static string Incr(string text, int increment)
{
if (text.Where(n => Char.IsNumber(n)).Count() == 0)
{
Console.WriteLine("string '{0}' not contants of nomber", text);
return string.Empty;
}
string revText = new string(text.Reverse().ToArray());
string a = new string(revText.TakeWhile(n => !Char.IsNumber(n)).ToArray());
string z = new string(revText.Skip(a.Length).TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray());
string d = z;
int zc = z.Length - Int32.Parse(z).ToString().Length;// count of 0.
int b = Int32.Parse(z) + increment;
if (b > 0)
{
z = z.Length == b.ToString().Length ? b.ToString() : new string('0', zc) + b;
}
else
{
z = z.Length == b.ToString().Length ? b.ToString() : new string('0', zc + 1) + Math.Abs(b);
}
string c = revText.Substring(a.Length + d.Length);
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(new string(z.Reverse().ToArray()));
sb.Append(c);
return new string(sb.ToString().Reverse().ToArray());
}
}
}
-
That's better, no errors, thanks:
I was also messing around with it as I've learnt from your code and I came up with:
static string Incr(string text, int increment)
{
if (text.Where(n => Char.IsNumber(n)).Count() == 0)
return null;
string revText = new string(text.Reverse().ToArray());
string a = new string(revText.TakeWhile(n => !Char.IsNumber(n)).ToArray());
string z = new string(revText.Skip(a.Length).TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray());
string y = new string(z.TakeWhile(n => n.Equals('0')).ToArray());
string c = revText.Substring(a.Length + z.Length);
int b = Int32.Parse(z) + increment;
if (b < 0) b = 0;
z = b.ToString();
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(new string(z.Reverse().ToArray()));
sb.Append(y);
sb.Append(c);
return new string(sb.ToString().Reverse().ToArray());
}
Very similar to yours. Again, thanks for your help Hwd. :-)
-
Again, thanks for your help Hwd. :-)
:-)
-
That's better, no errors, thanks:
I was also messing around with it as I've learnt from your code and I came up with:
static string Incr(string text, int increment)
{
if (text.Where(n => Char.IsNumber(n)).Count() == 0)
return null;
string revText = new string(text.Reverse().ToArray());
string a = new string(revText.TakeWhile(n => !Char.IsNumber(n)).ToArray());
string z = new string(revText.Skip(a.Length).TakeWhile(n => Char.IsNumber(n)).Reverse().ToArray());
string y = new string(z.TakeWhile(n => n.Equals('0')).ToArray());
string c = revText.Substring(a.Length + z.Length);
int b = Int32.Parse(z) + increment;
if (b < 0) b = 0;
z = b.ToString();
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(new string(z.Reverse().ToArray()));
sb.Append(y);
sb.Append(c);
return new string(sb.ToString().Reverse().ToArray());
}
Very similar to yours. Again, thanks for your help Hwd. :-)
Hope you don't mind but how about:
Console.WriteLine(Incr("asdf0004", -5));
~'J'~
-
how about:
Console.WriteLine(Incr("asdf0004", -5));
~'J'~
At the moment I'm not sure what is better for my purposes, to go into the negatives or to floor at 0, but since I said "stop at 0" near the start of the thread I've stayed with that. In time it might change.
-
A quickie with regular expressions:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace IncStr
{
class Program
{
static void Main(string[] args)
{
//string test1 = "ab12cd-34e";
string test2 = "a1.9b";
//string test3 = "ab12cd34e66";
string pattern = "[-+]?[0-9]+";
MatchCollection matches = Regex.Matches(test2, pattern);
if (matches == null || matches.Count == 0) return;
foreach (Match match in matches)
{
Console.WriteLine("{0}Match index: {1}", Environment.NewLine, match.Index);
Console.WriteLine("{0}Match value: {1}", Environment.NewLine, match.Value);
Console.WriteLine("{0}Match length: {1}", Environment.NewLine, match.Length);
}
// work with the last match only...
Match lastMatch = matches[matches.Count - 1];
int testIncrement = 2;
int newValue;
bool result = int.TryParse(lastMatch.Value, out newValue);
string replacedString = test2.Substring(0, lastMatch.Index) +
(newValue + testIncrement) +
test2.Substring(lastMatch.Index + lastMatch.Length);
Console.WriteLine(replacedString);
Console.ReadLine();
}
}
}
-
Thanks Glenn. :-)
It doesn't keep zero prefixes, but I'm happy to see a regex example anyway.
-
It's just an example to show what's possible. It's up to you or somebody else to come up with the arcane regex incantation needed :D
-
the arcane regex incantation needed :D
That's exactly what I thought when I was trying to work it out - by the time I learn the required regex combination I could have twice written something from scratch that does it. Probably worthwhile to know, but it's a language inside a language.
-
noticed this a couple of weeks ago
Regex Editor Add-on
http://visualstudiogallery.msdn.microsoft.com/en-us/55c24bf1-2636-4f94-831d-28db8505ce00?SRC=VSIDE
Haven't made time to look at it yet.