提问人:Maxim Gershkovich 提问时间:11/1/2012 最后编辑:Kirill PolishchukMaxim Gershkovich 更新时间:8/23/2023 访问量:26787
在 C 中提取字符串末尾的数字#
Extract number at end of string in C#
问:
可能对此进行了过度分析,但 stackoverflow 建议是返回包含在字符串末尾的整数的最佳方法。
到目前为止,我已经考虑过使用简单的循环、LINQ 和正则表达式,但我很好奇我会从社区得到什么方法。显然,这不是一个难以解决的问题,但解决方案可能会有所不同。
因此,更具体地说,您将如何创建一个函数来返回附加在任意长度字符串末尾的任意长整数/长
CPR123 => 123
ABCDEF123456 => 123456
答:
使用以下正则表达式:
\d+$
// RegexOptions.RightToLeft – is optional, but will increase performance
var result = Regex.Match(input, @"\d+$", RegexOptions.RightToLeft).Value;
或不带正则表达式的单行:
var result = input[^input.Reverse().TakeWhile(char.IsDigit).Count()..];
或更有效的方式:
int numberOfDigitsAtEnd = 0;
for (var i = input.Length - 1; i >= 0; i--)
{
if (!char.IsDigit(input[i]))
{
break;
}
numberOfDigitsAtEnd++;
}
var result = input[^numberOfDigitsAtEnd..];
[^0-9]+([0-9]+)
我认为应该这样做
评论
它总是采用 LettersNumbers 格式吗?
在这种情况下,这将起作用:
Regex _cellAddressRegex = new Regex(@"(?<Column>[a-z]+)(?<Row>[0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var rowm = Convert.ToInt32(parts.Groups["Row"]);
评论
Compiled
就我的经验而言,正则表达式是最简单的。
Regex ex = new Regex(@"(\d+)$")
这应该匹配它。只需将其包装在一个函数中即可。
评论
我可以为此发疯吗?
using System.Text;
using System.Linq;
static string GetNum(string input)
{
StringBuilder sb = new StringBuilder();
for (int i = input.Length - 1; i >= 0; i--)
{
if (input[i] < 48 || input[i] > 57)
break;
sb.Append(input[i]);
}
return String.Concat(sb.ToString().ToCharArray().Reverse());
}
强制性 LINQ 单行
var input = "ABCD1234";
var result = string.Concat(input.ToArray().Reverse().TakeWhile(char.IsNumber).Reverse());
评论
IsNumber
正则表达式模式有点贵,因为默认情况下,字符串是从左到右解析的。一旦正则表达式引擎找到 ,它就会继续匹配,当它遇到 时,匹配失败,尝试下一个位置,依此类推。\d+$
1
12abc34
2
a
但是,在 .NET 正则表达式中,有一个修饰符。它使正则表达式引擎从右到左解析字符串,您可能会更快地获得已知更接近末尾的匹配项。RegexOptions.RightToLeft
var result = Regex.Match("000AB22CD1234", @"\d+$", RegexOptions.RightToLeft);
if (result.Success)
{
Console.Write(result.Value);
} // => 1234
请参阅联机 C# 演示。
一个简单的循环可能在简单性和效率方面胜过任何其他解决方案。最终返回的字符串可以复制一次,而无需使用 Stack、StringBuilder、string。Concat 或其他更复杂的字符串支持函数。
string GetNumberFromEnd(string text)
{
int i = text.Length - 1;
while (i >= 0)
{
if (!char.IsNumber(text[i])) break;
i--;
}
return text.Substring(i + 1);
}
或者它甚至可以作为 int 类型直接返回:
bool GetIntFromEnd(string text, out int number)
{
int i = text.Length - 1;
while (i >= 0)
{
if (!char.IsNumber(text[i])) break;
i--;
}
return int.TryParse(text.Substring(i + 1), out number);
}
如果不使用难以理解的正则表达式,或者使用速度较慢的 Linq 和数组操作,则可以使用扩展方法中的简单循环。
它可以用于 or 或 or or 或 其它,同时适应 和 检查。long
int
ulong
uint
+
-
它也可以适应解析和/或。float
double
decimal
此方法也可以编写为具有异常。Parse
实现
static public class StringHelper
{
static public bool TryParseEndAsLong(this string str, out long result)
{
result = 0;
if ( string.IsNullOrEmpty(str) )
return false;
int index = str.Length - 1;
for ( ; index >= 0; index-- )
{
char c = str[index];
bool stop = c == '+' || c == '-';
if ( !stop && !char.IsDigit(c) )
{
index++;
break;
}
if ( stop )
break;
}
return index <= 0 ? long.TryParse(str, out result)
: long.TryParse(str.Substring(index), out result);
}
}
测试
test(null);
test("");
test("Test");
test("100");
test("-100");
test("100-200");
test("100 - 200");
test("Test 100");
test("Test100");
test("Test+100");
test("Test-100");
test("11111111111111111111");
Action<string> test = str =>
{
if ( str.TryParseEndAsLong(out var value) )
Console.WriteLine($"\"{str}\" => {value}");
else
Console.WriteLine($"\"{str}\" has not a long at the end");
};
输出
"" has not a long at the end
"" has not a long at the end
"Test" has not a long at the end
"100" => 100
"-100" => -100
"100-200" => -200
"100 - 200" => 200
"Test 100" => 100
"Test100" => 100
"Test+100" => 100
"Test-100" => -100
"11111111111111111111" has not a long at the end
快速函数,用于递增字符串末尾的数字并返回更新的字符串。
示例 “STR0232” --f(x)--> “STR0233”
public static string IncrementTrailingNumber(String Input)
{
string RtrnStr = "";
if (!string.IsNullOrEmpty(Input))
{
var result = Regex.Match(Input, @"\d+$", RegexOptions.RightToLeft).Value;
int Increment = 0;
if (result.Length>0)
try
{
Increment = int.Parse(result);
Increment++;
}
catch(Exception expn)
{ }
RtrnStr = Input.Substring(0,Input.Length-result.Length) + Increment.ToString($"D{result.Length}");
}
return RtrnStr;
}
上一个:使用 CSS 垂直拆分页面
下一个:十亿英里的软件修补
评论