查找字符串中最后一个数字,然后按该值拆分字符串



我试图完成的是找到字符串中的最后一个数字并除以该值。

string packageSize = "4/8.75LB";

上面我有一个字符串,我想将它拆分成一个字符串数组,并将它们放入数据库中的两个不同列中。第一部分是十进制,最后一部分是字符串或varchar。

我在下面有这个代码,它似乎正在工作。只是想知道是否有更好的解决方案,或者我错过了一个有答案的问题。

string value = Regex.Match(packageSize, @"(d+)(?!.*d)", RegexOptions.RightToLeft).ToString();
int lastIndex = packageSize.LastIndexOf(value) + value.Length;
string packageLoad = packageSize.Substring(0, lastIndex);
decimal loadDecimal = Convert.ToDecimal(packageLoad);

谢谢你的帮助!

"我想找到最后一个数字,并将字符串的两边一分为二;

性能方面,我认为你不会比循环做得更好:

for(int i = str.Length-1; i>=0; i--)
if(Char.IsDigit(str[i])){
return (str[..i], str[(i+1)..]);
}

它返回("4/8.7", "LB")的元组

--

你可以把它切换到其中一个:

var i = str.LastIndexOfAny("0123456789".ToCharArray());
var i = Array.FindLastIndex(str.ToCharArray(), Char.IsDigit);
return (str[..i], str[(i+1)..]);

让我困惑的是,你在评论中给出的规范与你在问题中给出的代码完全不同。。您的代码";作品";但是CCD_ 2不可能是CCD_。。

您可以使用

var output = Regex.Split(packageSize, @"(d)(?=D*$)");

(d)(?=D*$)正则表达式与(d)匹配并捕获一个数字,该数字也与Regex.Split一起返回(它输出捕获的子字符串)。(?=D*$)确保(d)与字符串中的最后一个数字匹配。

参见C#演示:

var packageSize = "4/8.75LB";
var result = Regex.Split(packageSize, @"(d)(?=D*$)");
foreach (var s in result)
Console.WriteLine(s);
// => 4/8.7
//    5
//    LB

如果需要确保regex分割确实发生,请检查输出数组的长度是否不等于1:

var packageSize = "4/8.75LB";
//var packageSize = "LB"; // => 'LB' did not match the regex.
var result = Regex.Split(packageSize, @"(d)(?=D*$)");
if (result.GetLength(0) != 1) { // We have found a match
foreach (var s in result)
Console.WriteLine(s);
}
else
{
Console.WriteLine($"'{packageSize}' did not match the regex.");
}

请参阅这个C#演示。

此外,如果只需要匹配ASCII数字,请使用Regex.Split(packageSize, @"(d)(?=D*$)", RegexOptions.ECMAScript)

您可以对匹配最后一位数字之前的第一部分和匹配最后一个数字之后的第二部分使用两个捕获组。

如果您希望每个组至少匹配一个字符,请将量词更改为+,而不是*

^(.*)[0-9](D*)$
  • ^字符串开始
  • (.*)捕获组1,匹配任何字符
  • [0-9]匹配个位数0-9
  • (D*)捕获组2,可选匹配非数字
  • $字符串结束

Regex演示

例如

string packageSize = "4/8.75LB";
Regex r = new Regex(@"^(.*?)[0-9](D*)$");
foreach (Match m in r.Matches(packageSize))
{
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine(m.Groups[2].Value);
}

输出

4/8.7
LB

不能100%确定我是否正确理解了要求,但此Regex将在第一组中捕获输入字符串中的最后一个数字,无论是否为十进制,在第二组中捕获以下字符:

(d+(?:.d+)?)(D*)$

因此,输入字符串"4/8.75LB"将被拆分为:

  • 第1组:"8.75"
  • 第2组:4/8.70

最新更新