我正在尝试从它们的类型名称中提取概要文件名。例如,输入类型名称如下:
"ST230X52";"S310X74";"WT305X62.5";"305x457x127UBT“
那么,如何才能得到输出为:"ST";"S“;"WT";"UBT”
发布于 2020-08-29 04:41:53
我认为最好的方法是使用Reguler表达式,使用下面的代码:
注意:我这样做就像一个例子:字符大写,开头和结尾
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
否则如果startFinding是true
结束这个循环(
break)
结果:
ST
S
WT
UBT发布于 2020-08-29 05:40:55
我就是这样做的:
public static string Extract(string text) =>
Regex.Matches(text, @"[^\d.]+").Cast<Match>()
.FirstOrDefault(match => match.Value.ToLower() != "x")?.Value;首先,我发现不包含数字或小数的一系列字符的匹配。然后,我返回第一个这样的运行,它不仅仅是一个"x“(不区分大小写)。如果不存在匹配项,则返回null。
发布于 2020-08-29 19:55:28
虽然这个问题并不缺乏答案,但我想再补充一个:)
这个问题描述了特定领域类型的一个很好的用例--包含产品类型的string实际上不是OP域上下文中的字符串。考虑以下类(RegEx匹配无耻地从@Wyck的答案中失窃):
特定域类型
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,以避免不必要的分配;配置文件名称在对象的构造过程中只计算一次。
用法示例:
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层应用程序的各个层,或者微服务体系结构应用程序的各种服务,等等。
享受吧!
https://stackoverflow.com/questions/63643307
复制相似问题