拆分字符串值 c#
Splitting string value c#
我想知道如何将字符串格式的值拆分为两部分。在我的 asp 应用程序中,我正在将字符串值从视图解析到控制器。
然后我想将整个值分成两部分。
示例如下:大多数情况下,前两个字母的值可能是文本值(如“PO”、“SS”、“GS”),其余为数字 (SS235452)。
数字的长度不能声明,因为它是随机生成的。所以想从字符串值的开头拆分它。需要帮助。
我当前的密码是
string approvalnumber = approvalCheck.ApprovalNumber.ToUpper();
谢谢。
您可以尝试使用正则表达式从字符串中提取字母和数字。
此 javascript 函数 returns 仅输入字符串中的数字。
function getNumbers(input) {
return input.match(/[0-9]+/g);
}
我会使用 RegExp。考虑到您指示 ASP-NET-4 的事实,我假设您不能使用元组、out var
等,所以它会如下所示:
using System.Text.RegularExpressions;
using FluentAssertions;
using Xunit;
namespace Playground
{
public class Playground
{
public struct ProjectCodeMatch
{
public string Code { get; set; }
public int? Number { get; set; }
}
[Theory]
[InlineData("ABCDEFG123", "ABCDEFG", 123)]
[InlineData("123456", "", 123456)]
[InlineData("ABCDEFG", "ABCDEFG", null)]
[InlineData("ab123", "AB", 123)]
public void Split_Works(string input, string expectedCode, int? expectedNumber)
{
ProjectCodeMatch result;
var didParse = TryParse(input, out result);
didParse.Should().BeTrue();
result.Code.Should().Be(expectedCode);
result.Number.Should().Be(expectedNumber);
}
private static bool TryParse(string input, out ProjectCodeMatch result)
{
/*
* A word on this RegExp:
* ^ - the match must happen at the beginning of the string (nothing before that)
* (?<Code>[a-zA-Z]+) - grab any number of letters and name this part the "Code" group
* (?<Number>\d+) - grab any number of numbers and name this part the Number group
* {0,1} this group must occur at most 1 time
* $ - the match must end at the end of the string (nothing after that)
*/
var regex = new Regex(@"^(?<Code>[a-zA-Z]+){0,1}(?<Number>\d+){0,1}$");
var match = regex.Match(input);
if (!match.Success)
{
result = default;
return false;
}
int number;
var isNumber = int.TryParse(match.Groups["Number"].Value, out number);
result = new ProjectCodeMatch
{
Code = match.Groups["Code"].Value.ToUpper(),
Number = isNumber ? number : null
};
return true;
}
}
}
正如您已经提到的,第一部分将有 2 个字母,只有第二部分有所不同,您可以使用字符串的子字符串方法,如下所示。
var textPart = input.Substring(0,2);
var numPart = input.Substring(2);
第一行从索引 0 开始获取 2 个字符,第二个语句从索引 2 获取所有字符。如果需要,您可以将第二部分转换为数字。
请注意Substring的第二个参数在第二行没有提到。此参数用于长度,如果未提及,则获取到字符串末尾。
一个 linq 答案:
string d = "PO1232131";
string.Join("",d.TakeWhile(a => Char.IsLetter(a)))
我想知道如何将字符串格式的值拆分为两部分。在我的 asp 应用程序中,我正在将字符串值从视图解析到控制器。
然后我想将整个值分成两部分。
示例如下:大多数情况下,前两个字母的值可能是文本值(如“PO”、“SS”、“GS”),其余为数字 (SS235452)。
数字的长度不能声明,因为它是随机生成的。所以想从字符串值的开头拆分它。需要帮助。
我当前的密码是
string approvalnumber = approvalCheck.ApprovalNumber.ToUpper();
谢谢。
您可以尝试使用正则表达式从字符串中提取字母和数字。
此 javascript 函数 returns 仅输入字符串中的数字。
function getNumbers(input) {
return input.match(/[0-9]+/g);
}
我会使用 RegExp。考虑到您指示 ASP-NET-4 的事实,我假设您不能使用元组、out var
等,所以它会如下所示:
using System.Text.RegularExpressions;
using FluentAssertions;
using Xunit;
namespace Playground
{
public class Playground
{
public struct ProjectCodeMatch
{
public string Code { get; set; }
public int? Number { get; set; }
}
[Theory]
[InlineData("ABCDEFG123", "ABCDEFG", 123)]
[InlineData("123456", "", 123456)]
[InlineData("ABCDEFG", "ABCDEFG", null)]
[InlineData("ab123", "AB", 123)]
public void Split_Works(string input, string expectedCode, int? expectedNumber)
{
ProjectCodeMatch result;
var didParse = TryParse(input, out result);
didParse.Should().BeTrue();
result.Code.Should().Be(expectedCode);
result.Number.Should().Be(expectedNumber);
}
private static bool TryParse(string input, out ProjectCodeMatch result)
{
/*
* A word on this RegExp:
* ^ - the match must happen at the beginning of the string (nothing before that)
* (?<Code>[a-zA-Z]+) - grab any number of letters and name this part the "Code" group
* (?<Number>\d+) - grab any number of numbers and name this part the Number group
* {0,1} this group must occur at most 1 time
* $ - the match must end at the end of the string (nothing after that)
*/
var regex = new Regex(@"^(?<Code>[a-zA-Z]+){0,1}(?<Number>\d+){0,1}$");
var match = regex.Match(input);
if (!match.Success)
{
result = default;
return false;
}
int number;
var isNumber = int.TryParse(match.Groups["Number"].Value, out number);
result = new ProjectCodeMatch
{
Code = match.Groups["Code"].Value.ToUpper(),
Number = isNumber ? number : null
};
return true;
}
}
}
正如您已经提到的,第一部分将有 2 个字母,只有第二部分有所不同,您可以使用字符串的子字符串方法,如下所示。
var textPart = input.Substring(0,2);
var numPart = input.Substring(2);
第一行从索引 0 开始获取 2 个字符,第二个语句从索引 2 获取所有字符。如果需要,您可以将第二部分转换为数字。
请注意Substring的第二个参数在第二行没有提到。此参数用于长度,如果未提及,则获取到字符串末尾。
一个 linq 答案:
string d = "PO1232131";
string.Join("",d.TakeWhile(a => Char.IsLetter(a)))