首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中从字符串中获取特定文本

如何在C#中从字符串中获取特定文本
EN

Stack Overflow用户
提问于 2020-08-29 04:06:04
回答 4查看 307关注 0票数 0

我正在尝试从它们的类型名称中提取概要文件名。例如,输入类型名称如下:

"ST230X52";"S310X74";"WT305X62.5";"305x457x127UBT“

那么,如何才能得到输出为:"ST";"S“;"WT";"UBT”

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-29 04:41:53

我认为最好的方法是使用Reguler表达式,使用下面的代码:

注意:我这样做就像一个例子:字符大写,开头和结尾

代码语言:javascript
复制
public static string GetProfileName(string input)
{
    List<char> result = new List<char>();
    bool startFinding = false;

    foreach (char c in input.ToCharArray())
    {
        // Is match A to Z in upper case?
        if (Regex.IsMatch(c.ToString(), "[A-Z]"))
        {
            result.Add(c);
            startFinding = true;
        }
        else if(startFinding)
        {
            // End looping
            break;
        }
    }

    return new string(result.ToArray());
}

解释这种方法

变量:

首先,我将List<char>定义为变量,它将是结果。

startFinding定义了did方法,开始从And中查找字符。

方法:

我在每个字符中做了循环(foreach)

如果字符来自大写字母A-Z (使用Regex):

将此字符添加到result中,将startFinding更改为true

否则如果startFindingtrue

结束这个循环(break)

结果:

代码语言:javascript
复制
ST
S
WT
UBT
票数 0
EN

Stack Overflow用户

发布于 2020-08-29 05:40:55

我就是这样做的:

代码语言:javascript
复制
public static string Extract(string text) =>
    Regex.Matches(text, @"[^\d.]+").Cast<Match>()
         .FirstOrDefault(match => match.Value.ToLower() != "x")?.Value;

首先,我发现不包含数字或小数的一系列字符的匹配。然后,我返回第一个这样的运行,它不仅仅是一个"x“(不区分大小写)。如果不存在匹配项,则返回null

票数 3
EN

Stack Overflow用户

发布于 2020-08-29 19:55:28

虽然这个问题并不缺乏答案,但我想再补充一个:)

这个问题描述了特定领域类型的一个很好的用例--包含产品类型的string实际上不是OP域上下文中的字符串。考虑以下类(RegEx匹配无耻地从@Wyck的答案中失窃):

特定域类型

代码语言:javascript
复制
class ProductType
{
    private static Regex profileNameRule = new Regex(@"[^\d.]+");

    public string Name { get; private set; }
    public string ProfileName { get; private set; }

    private string ExtractProfileName(string text)
        => profileNameRule.Matches(text)
                          .Cast<Match>()   // this call is necessary on .NET Framework, but not on .NET Core
                          .FirstOrDefault(x => x.Value.ToLower() != "x")?.Value;

    private ProductType(string name)
        => (Name, ProfileName) = (name, ExtractProfileName(name));

    public static implicit operator ProductType(string name)
        => new ProductType(name);
}

解释:

该类有一个私有构造函数,因此创建该类实例的唯一方法是使用来自string的隐式转换--而在可能发生故障的情况下,隐式转换可能是不好的,在这种情况下,转换总是成功的(如果输入的字符串首先表示无效的产品类型,但不会失败)。

定义表示概要文件名称的规则的Regex对象是static,以避免不必要的分配;配置文件名称在对象的构造过程中只计算一次。

用法示例:

代码语言:javascript
复制
var products = new ProductType[] { "ST230X52", "S310X74", "WT305X62.5", "305x457x127UBT" };

foreach (var product in products)
{
    Console.WriteLine($"Product name: {product.Name}, Profile name: {product.ProfileName}");
}

/*
    OUTPUT:

Product name: ST230X52, Profile name: ST
Product name: S310X74, Profile name: S
Product name: WT305X62.5, Profile name: WT
Product name: 305x457x127UBT, Profile name: UBT
           
*/

为什么要使用这种方法

在代码中引入特定领域类型的想法可以极大地提高可读性,因为与这些类型的内部工作相关的逻辑现在封装在类型本身中。这些类型也可以进行单元测试,以确保正确的功能。这些类型也可以分组到一个库中,这个库可以被共享,例如,跨n层应用程序的各个层,或者微服务体系结构应用程序的各种服务,等等。

享受吧!

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

https://stackoverflow.com/questions/63643307

复制
相关文章

相似问题

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