当前位置: 首页 > 编程语言 > C#

使用格式模板解析字符串?分享

时间:2023-04-10 11:31:52 C#

使用格式模板解析字符串?如果我可以使用string.Format("my{0}template{1}here",1,2)格式化字符串,我可以逆转这个过程-我提供模板并填充字符串,.net返回arg0、arg1等吗?没有优雅的方法来反转格式化的字符串。但是如果你想要一个简单的功能,你可以试试这个。privateListreverseStringFormat(stringtemplate,stringstr){//处理正则表达式特殊字符。template=Regex.Replace(template,@"[\^$.|?*+()]",m=>"\"+m.Value);字符串模式="^"+Regex.Replace(template,@"{[0-9]+}","(.*?)")+"$";正则表达式r=新的正则表达式(模式);匹配m=r.Match(str);列表ret=newList();for(inti=1;i一般来说,String.Format是不可逆的。如果只有一个{0},你至少可以写提取值的字符串表示形式形成通用代码。你一定不能逆向产生原始对象。示例:多个参数:string.Format("my{0}{1}","aa","aaa");生成“myaaaaa”,尝试反转string.ReverseFormat("my{0}{1}","aa","aaa")1}","myaaaaa")必须决定如何在没有任何信息的情况下将"aaaaa"部分分成2部分。无法反转Datatypestring.Format("{0:yyyy}",DateTime.Now);结果是在2011年,关于值本身的大部分信息都丢失了。使用正则表达式来解析组匹配。Regex.Match("我的(.*)模板(.*)在这里",theFilledInString);我没有打开VS,所以我无法验证我的方法名称是否正确,但你会明白我的意思。通过使用括号,返回的匹配结果将包含包含提取匹配的组[0]和组[1]。一种方法是使用正则表达式。对于您的示例,您可以这样做:Regexregex=newRegex("^my(.*?)template(.*?)here$");Matchmatch=regex.Match("我的53模板22在这里");字符串arg0=match.Groups[1].Value;//="53"字符串arg1=match.Groups[2].Value;//="22"基于这种技术写一个扩展方法来做你想做的事情并不难。只是为了好玩,这是我第一次天真的尝试。我没有测试过这个,但它应该很接近。publicstaticobject[]ExtractFormatParameters(thisstringsourceString,stringformatString){RegexplaceHolderRegex=newRegex(@"{(d+)}");正则表达式formatRegex=newRegex(placeHolderRegex.Replace(formatString,m=>"(.*?)");Matchmatch=formatRegex.Match(sourceString);if(match.Success){varoutput=newobject[match.Groups.Count-1];for(inti=0;iThiswillallowyoutoDoobject[]args=sourceString.ExtractFormatParameters("my{0}template{1}here");这个方法很天真,有很多问题,但它基本上在格式表达式中找到任何占位符并将它们用于查找源字符串中的相应文本。它将为您提供与从左到右列出的占位符对应的值,而不引用序号或占位符中指定的任何格式.这个函数可以加上。另一个问题是formatstring中任何特殊的正则表达式字符都会导致这个方法失败。需要对formatRegex进行更多的处理,以转义任何属于formatString的特殊字符。以上是C#学习教程:使用格式模板解析字符串?分享所有内容,如果对您有用,需要了解更多C#学习教程,希望您多加关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: