对不起,我很难为这篇文章想出一个合适的标题。如果标题不清楚,请道歉。
我有许多字符串遵循这样的格式
"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
希望我的回答可以帮助您