首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更好的解析字符串的方法?

有没有更好的解析字符串的方法?
EN

Stack Overflow用户
提问于 2015-04-15 15:11:20
回答 5查看 3.6K关注 0票数 38

我想知道在.NET中是否有一个用来解析字符串位的内置方式。

例如,我有以下字符串:

代码语言:javascript
复制
"bsarbirthd0692"

由以下部分组成,以后将与数据交叉引用:

代码语言:javascript
复制
Indexes   Purpose
0-3       (name)
4-9       (description)
10-13     (date mm-yy)

我希望有这样的本土化的东西:

代码语言:javascript
复制
string name, desc, date;
string.ParseFormat("{0:4}{1:5}{2:4}", "bsarbirthd0692", out name, out desc, out date);

在.NET或流行的库中,是否有一种本地的方法来做到这一点?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-15 15:15:58

由于已知格式,且不应更改子字符串,因此应适用于您

代码语言:javascript
复制
string data = "bsarbirthd0692";
string name, desc, date;
name = data.Substring(0, 4);
desc = data.Substring(4, 6);
date = data.SubString(10);

编辑

还有一些扩展方法,您可以创建这些方法来执行任何您想做的事情。这显然比以前的建议复杂得多。

代码语言:javascript
复制
public static class StringExtension
{
    /// <summary>
    /// Returns a string array of the original string broken apart by the parameters
    /// </summary>
    /// <param name="str">The original string</param>
    /// <param name="obj">Integer array of how long each broken piece will be</param>
    /// <returns>A string array of the original string broken apart</returns>
    public static string[] ParseFormat(this string str, params int[] obj)
    {
        int startIndex = 0;
        string[] pieces = new string[obj.Length];
        for (int i = 0; i < obj.Length; i++)
        {
            if (startIndex + obj[i] < str.Length)
            {
                pieces[i] = str.Substring(startIndex, obj[i]);
                startIndex += obj[i];
            }
            else if (startIndex + obj[i] >= str.Length && startIndex < str.Length)
            {
                // Parse the remaining characters of the string
                pieces[i] = str.Substring(startIndex);
                startIndex += str.Length + startIndex;
            }

            // Remaining indexes, in pieces if they're are any, will be null
        }

        return pieces;
    }
}

用法1:

代码语言:javascript
复制
string d = "bsarbirthd0692";
string[] pieces = d.ParseFormat(4,6,4);

结果:

用法2:

代码语言:javascript
复制
string d = "bsarbirthd0692";
string[] pieces = d.ParseFormat(4,6,4,1,2,3);

结果:

票数 50
EN

Stack Overflow用户

发布于 2015-04-15 15:20:56

您可以使用Regexp进行此操作。

代码语言:javascript
复制
string str= "bsarbirthd0692";
var regex = "(?<name>.{4})(?<desc>.{6})(?<date>.{4})";
MatchCollection matches = Regex.Matches(str, regex);
foreach(Match m in matches){
    Console.WriteLine(m.Groups["name"].ToString());
    Console.WriteLine(m.Groups["desc"].ToString());
    Console.WriteLine(m.Groups["date"].ToString());
}
票数 16
EN

Stack Overflow用户

发布于 2015-04-15 15:17:42

没有类似的东西,但是写一些东西来实现:

代码语言:javascript
复制
IEnumerable<string> inputString.BreakIntoLengths(4, 6, 4)

签名:

代码语言:javascript
复制
public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths);

很简单:

代码语言:javascript
复制
public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths) {

  var pos = 0;
  foreach (var len in lengths) {
    yield return input.Substring(pos, len);
    pos += len;
  }
}

(实际的实现有一些错误检查。)

注意:我已经删除了格式字符串,如接口:它似乎没有提供任何价值。一旦返回集合,就很容易按索引分配条目。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29653991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档