【问题标题】:Split string at first alphabetic character在第一个字母字符处拆分字符串
【发布时间】:2017-03-08 23:24:27
【问题描述】:

我有一个如下的字符串数组,如图所示。在遍历数组时,我需要将数值和字母值分开。 例如:

  • 35.00MY 到 35.00 和 MY
  • 2.10D8 到 2.10 和 D8
  • 80.00YRI 到 80.00 和 YRI
  • 4.00G8 到 4.00 和 G8

    我尝试了以下代码,但没有帮助

foreach (string taxText in taxSplit) {
    Regex re = new Regex(@"([a-zA-Z]+)(\d+)");
    Match result = re.Match(taxText);
    string alphaPart = result.Groups[1].ToString();
    string numberPart = result.Groups[2].ToString(); }

都返回空

【问题讨论】:

  • 如果它的 35.00ab3500bc 会发生什么
  • 我需要它作为 35.00 和 ab3500bc。我总是在开始时有数字,然后是带或不带数字的字母
  • 您的正则表达式与您所描述的不符。你的数字和字母颠倒了;您的样本是 NumberLetter,而您的正则表达式是 LetterNumber。试试([)(0-9\.]+)(.+);数字在 Groups[1] 中,字母在 Groups[2] 中。适用于您发布的所有示例。第三个将在G8 之前包含一个空格,但如果这是一个问题,您可以使用String.Trim() 删除它。
  • D8、YRI ... 的代表是什么?
  • 我的错。蹩脚的笔记本电脑触摸板移动了光标;我一定是用手掌碰到了它。请改用([0-9\.]+)(.+)

标签: c# string


【解决方案1】:

您可以将Split 混为一谈,并使用前瞻(?= ... ) 和后瞻(?<= ... )

string original = "35.00ab3500bc";
Regex reg = new Regex("(?<=[0-9])(?=[A-Za-z])");
string[] parts = reg.Split(original, 2);

在这里,我们必须实例化一个新的Regex 实例,因为这个版本的Split 不能作为static 方法使用。我们传递的模式说要找到一个空白,其中空白的左侧是一个数字(即向后看),空白的右侧是一个字母(即向前看)。我们通过2 表示我们最多需要parts 中的两个项目。

【讨论】:

  • 80.00YRI 返回三个字符串; - 80.00, - Y , -RI ,
  • 好的,那么我已经删除了原始模式。我在最近的编辑中添加的第二个模式应该可以解决手头的问题。答案已更新。
【解决方案2】:
var lst = new List<string>() { "35.00MY", "2.10D8", "80.00YRI", "4.00GB" };
var res = new List<string>();

lst.ForEach(v =>
{
    res.Add(new string(v.TakeWhile(c => !Char.IsLetter(c)).ToArray()));
    res.Add(v.TrimStart("01234567890.".ToCharArray()));
} );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2021-03-10
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多