Pra*_*ant 6 c# regex linq string
我有一个900-1000个字符长的字符串.模式字符串如下
"编号:东西,somestringNumber:什么东西,somestring"
等示例字符串:
"23:值,ordernew14:valueagain,orderagain"
要求是每当超过1000个字符时,我必须删除前500个字符.然后如果不以Number开头,我必须删除字符,直到我到达第一个字符为数字的点
sortinfo = sortinfo.Remove(0, 500);
sortinfo = new string(sortinfo.SkipWhile(c => !char.IsDigit(c)).ToArray());
Run Code Online (Sandbox Code Playgroud)
我可以借助上面的代码来做到这一点
在上面的例子中,如果我给删除5个字符输出将是
14:valueagain,orderagain
这很好.但如果字符串有值:
23:值,or3dernew14:valueagain,orderagain
并删除5个字符,输出为
3dernew14:valueagain,orderagain
并且要求是
14:valueagain,orderagain
因此它打破了一切,因为它的格式不正确.请帮帮我怎样才能做到这一点
我的完整代码
class Program
{
static void Main(string[] args)
{
string str;
str=TrimSortInfo("23:value,ord4er24:valueag4ain,order6again15:value,order"); // breaking value
//str = TrimSortInfo("23:value,order24:valueagain,orderagain15:value,order"); //working value
Console.WriteLine(str);
Console.ReadLine();
}
static string TrimSortInfo(string sortinfo)
{
if (sortinfo.Length > 15)
{
sortinfo = sortinfo.Remove(0, 15);
sortinfo = new string(sortinfo.SkipWhile(c => !char.IsDigit(c))
.ToArray());
return sortinfo;
}
return sortinfo;
}
}
Run Code Online (Sandbox Code Playgroud)
使用正则表达式:
static Regex rx = new Regex("(?<=.*?)[0-9]+:.*");
static string TrimSortInfo(string sortinfo, int trimLength = 15)
{
if (sortinfo.Length > trimLength)
{
return rx.Match(sortinfo, trimLength).Value;
}
return sortinfo;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这里存在很大的风险:您可以在数字的“中间”进行修剪。
所以你可以将“xxxxxxxxxxxxxx24:something”修剪为“4:something”。
正则表达式的意思是:查找一系列数字 0-9(至少一个数字)( [0-9]+
),后跟 a :
,然后是所有其他字符 ( .*
)。在该序列之前可以有任何其他字符,但只能是尽可能少的数量(?<=.*?)
。该前置序列未被捕获(?<=...)
。
最后,正则表达式可以简化为:
static Regex rx = new Regex("[0-9]+:.*");
Run Code Online (Sandbox Code Playgroud)
因为它是非锚定的,所以比赛将从第一次出现比赛开始。
为了解决这个问题:
static Regex rx = new Regex("(?:[^0-9])([0-9]+:.*)");
static string TrimSortInfo(string sortinfo, int trimLength = 15)
{
if (sortinfo.Length > trimLength)
{
return rx.Match(sortinfo, trimLength - 1).Groups[1].Value;
}
return sortinfo;
}
Run Code Online (Sandbox Code Playgroud)
我们作弊一点。为了修剪 15 个字符,我们跳过 14 个字符 ( trimLength - 1
),然后捕获一个非数字字符(我们将忽略它(?:[^0-9])
)加上数字和 : 以及其他所有内容([0-9]+:.*)
。注意使用Groups[1].Value