簡體   English   中英

增加同時包含字母和數字的字符串

[英]Increment a string with both letters and numbers

我有一個字符串,我需要將其遞增 1 該字符串既有字符也有數值。

我的字符串布局如下“MD00494”

我如何將其增加到“MD00496”和“MD00497”等

如果它是一個帶數字的普通字符串,我會將它解析為一個 int。

我嘗試了以下

 int i = int.Parse(sdesptchNo);
 i++;
 txtDispatchNo.Text = i.ToString();

任何人有任何想法我會如何 go 對此。

您首先應該弄清楚字符串之間的任何共性。 如果最后總是有一個字母前綴,后跟數字(具有固定寬度),那么您只需刪除字母,解析其余字母,遞增並再次將它們粘在一起。

例如,在您的情況下,您可以使用以下內容:

var prefix = Regex.Match(sdesptchNo, "^\\D+").Value;
var number = Regex.Replace(sdesptchNo, "^\\D+", "");
var i = int.Parse(number) + 1;
var newString = prefix + i.ToString(new string('0', number.Length));

另一個可能更強大的選項可能是

var newString = Regex.Replace(x, "\\d+",
    m => (int.Parse(m.Value) + 1).ToString(new string('0', m.Value.Length)));

這將用相同寬度的遞增數字替換字符串中的任何數字 - 但讓每個非數字完全相同並位於相同的位置。

這是一種非正則表達式方式:P

string str = "MD00494";
string digits = new string(str.Where(char.IsDigit).ToArray());
string letters = new string(str.Where(char.IsLetter).ToArray());

int number;
if (!int.TryParse(digits, out number)) //int.Parse would do the job since only digits are selected
{
    Console.WriteLine("Something weired happened");
}

string newStr = letters + (++number).ToString("D5");

輸出將是:

newStr = "MD00495"

假設您只需要增加字符串的數字部分,並且字符串的結構總是 - 一堆非數字字符后跟一堆數字,您可以使用正則表達式將字符串分解為這些兩個組件,將數字部分轉換為整數,遞增,然后連接回來。

var match = Regex.Match("MD123", @"^([^0-9]+)([0-9]+)$");
var num = int.Parse(match.Groups[2].Value);

var after = match.Groups[1].Value + (num + 1);

您需要找到字符串中第一個數字的位置。 然后將字符串拆分為 2 個字段。

0 1 2 3 4 5 6

MD 0 0 4 9 4

第一個字段將是非數字部分“MD” 第二個字段將是數字部分“00494”

將數字部分增加到“00495”

您將丟失前導零,因此一旦增加,您需要用相同數量的零填充新數字。

然后加入2個字段。

如果字符串中間有一個數字,例如 XXX123YYY456,則接受的答案不起作用,將拋出異常。
我已經編寫了一個通用方法,它將遞增字符串的末尾,您可以將最少的數字傳遞給它。

public static string IncrementStringEnd(string name, int minNumericalCharacters = 1)
        {
            var prefix = System.Text.RegularExpressions.Regex.Match(name, @"\d+$");
            if (prefix.Success)
            {
                var capture = prefix.Captures[0];
                int number = int.Parse(capture.Value) + 1;
                name = name.Remove(capture.Index, capture.Length) + number.ToString("D" + minNumericalCharacters);
            }

            return name;
        }

試驗結果:
MD00494:MD00495
XXX123YYY456: XXX123YYY457
SD50MRF999: SD50MRF1000
SD50MRF9: SD50MRF010
用於測試目的https://do.netfiddle.net/j1f6wh

您可以使用正則表達式:

int kod = int.Parse(Regex.Replace(sdesptchNo, "[^0-9]", "")) + 1;

string zeroStr=Regex.Replace(sdesptchNo, "[^0-9]", "");
string newZeroStr="";
for (int x=0;x<zeroStr.length;x++)
     if (zeroStr[x]=='0') newZeroStr=newZeroStr+"0"; 
     else break;

string newVal=Regex.Replace(sdesptchNo, "[0-9]", "") + newZeroStr + kod;

更新:這將保存您的零

這是我的解決方案:

string str = Console.ReadLine();
string digits = new string(str.Where(char.IsDigit).ToArray());
string letters = new string(str.Where(char.IsLetter).ToArray());
string newStr;
int number;

if (!int.TryParse(digits, out number)) 
{
  Console.WriteLine("Something weird happened");
}
if (digits.StartsWith("0"))
{
  newStr = letters + (++number).ToString("D5");
}
else
{
  newStr = letters + (++number).ToString();
}

嘗試一下!

string sDispatchNo = "MS00914";
var pattern = @"^[a-zA-Z]+";
var strPart = Regex.Match(sDispatchNo, pattern).Value;
var noPart = Regex.Replace(sDispatchNo, pattern, "");
var no = int.Parse(noPart);
var length = noPart.Length;
length = (no + 1)/(Math.Pow(10,length)) == 1 ? length + 1 : length; 
var output = strPart + (no + 1).ToString("D" + length);

我用它來增加/減少條碼

/// <summary>
/// Gets the number portion of the string and adds 1 to it
/// </summary>
public static string IncrementNumbers(this string numString)
{
  if (numString.IsEmpty())
    return numString;
  else if (!numString.Where(Char.IsDigit).Any())
    return numString;
  else
  {
    string prefix = Regex.Match(numString, "^\\D+").Value;
    string number = Regex.Replace(numString, "^\\D+", "");
    int i = int.Parse(number) + 1;
    return prefix + i.ToString($"D{numString.Length - prefix.Length}");
  }
}

/// <summary>
/// Gets the number portion of the string and subtracts 1 from it
/// </summary>
public static string DecrementNumbers(this string numString)
{
  if (numString.IsEmpty())
    return numString;
  else if (!numString.Where(Char.IsDigit).Any())
    return numString;
  else
  {
    string prefix = Regex.Match(numString, "^\\D+").Value;
    string number = Regex.Replace(numString, "^\\D+", "");
    int i = int.Parse(number) - 1;
    return prefix + i.ToString($"D{numString.Length - prefix.Length}");
  }
}

/// <summary>
/// Shortented IsNullOrWhiteSpace 
/// </summary>
public static bool IsEmpty(this string str)
{
  if (str.TrimFix() == null)
    return true;

  return false;
}

/// <summary>
/// Trims the String and returns Null if it's empty space
/// </summary>
public static string TrimFix(this string rawString)
{
  if (!string.IsNullOrWhiteSpace(rawString))
  {
    return rawString.Trim();
  }
  return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM