按字符类型确定子字符串的终点

  • 本文关键字:字符串 终点 字符 类型 c#
  • 更新时间 :
  • 英文 :


对不起,我很难为这篇文章想出一个合适的标题。如果标题不清楚,请道歉。

我有许多字符串遵循这样的格式

"Application has been dispatched to the client 5  business day(s) ago. Signed application has not been received"

我想将其子串到数字 5 .

所以结果将是

 "Application has been dispatched to the client"

但是,我并不总是知道数值之前有多少个字符

某些字符串具有不同的消息,但结构相似。总有一个数字。

另一个例子

"Client signed the application 13 day(s) ago."

现在在这个中,我想获得以下输出

"Client signed the application"

基本上,我需要一种方法来获取所有内容,直到数值。

我该怎么做?

希望这是清楚的,提前感谢!

干杯!

听起来你需要一些正则表达式。由于您想要直到数字,这应该有效:

var regex = new Regex(@" d+");
var result = input.Substring(0, regex.Match(input).Index));

(假设input是你的字符串(。这将从开始到第一个数字(不包括空格(的子字符串。

请注意,如果字符串没有数字,则结果将为空。如果希望它返回该实例中的整个字符串,则可以使用 if 语句来测试匹配索引是否为零。

string result = Regex.Match(str, @"D*").Value;

D匹配任何非数字字符,*匹配 0 次或更多次。

或更短一点:

string result = Regex.Split(str, @"d")[0];

我喜欢函数式编程,所以我想先用 F# 解决这个问题。这是我想到的:

let findNumber (s : string) =
    let rec loop i =
        if i >= s.Length then -1
        elif Core.char.IsDigit s.[i] then i
        else loop (i + 1)
    loop 0
let truncateAtNumber s =
    match findNumber s with
    | -1 -> s
    | p -> (s.Substring (0, p)).Trim ()

简短而干净。但是,我很惊讶C#翻译实际上更短(编辑:现在更短(:

static string TruncateAtNumber(this string s)
{
    for (int i = 0; i < s.Length; i++)
        if (char.IsDigit(s[i]))
            return s.Substring(0, i).Trim();
    return s;
}

老实说,您可以使用split((字符串将字符串值转换为数组

例如:

var str = "Client signed the application 13 day(s) ago"; 
var res = str.Split(' '); // split when space found
Console.WriteLine(res[0]); // output value when array index at 0

因此,输出应为:

Client 

之后,您只需循环数组中的数据,当找到可以转换为整数的字符串数据时,必须停止循环

        int number, index = 0;
        bool result = false; 
        while (result == false)
        {
            Console.WriteLine(res[index]);
            index++;
            result = Int32.TryParse(res[index], out number);
        }

最后输出应该是

Client 
signed 
the 
application

希望我的回答可以帮助您

最新更新