C#实现类似"hello $world"的格式化字符串方法
C#自带的string.Format可以格式化字符串,但是还是不太好用,由于格式的字符占位符都是数字,当数目较多时容易混淆。其实可以扩展string的方法,让C#的字符串具备其他的方法,下面介绍一个实现类似String.jQueryStringFormat("hello $world", new {world="cnblog" })的扩展方法。
1 变量前缀$
可以仿照jQuery中的选择器方法,用$作为变量前缀。例如 I love \$something 中的$someting就是变量,可以将something变量的值替换到字符串中。
//模板字符串前缀
private static readonly string __prefix = "$";
// $ 正则表达式 $name
private static readonly Regex VariableRegex = new Regex(@"\$(@{0,1}[a-zA-Z_\.0-9]+)");
2 正则表达式捕获变量
上面定义了变量的规则,必须是$打头的有效变量,下面将字符串用该正则表达式进行捕获
private static IEnumerable<string> GetEnumerateVariables(string s)
{
var matchCollection = VariableRegex.Matches(s); for (int i = ; i < matchCollection.Count; i++)
{
yield return matchCollection[i].Groups[].Value;
}
}
3 用反射获取对象属性的值
传入的对象含有各个属性,写一个方法获取指定属性的值
/// <summary>
/// 获取对象的对应属性值
/// </summary>
/// <param name="oValue">包含值的对象</param>
/// <param name="name">属性名</param>
/// <returns></returns>
private static object ValueForName(object oValue, string name)
{
Type type = oValue.GetType();
var property = type.GetProperty(name);
if (property != null)
{
return property.GetValue(oValue, new object[]);
} var field = type.GetField(name);
if (field != null)
{
return field.GetValue(oValue);
}
throw new FormatException("未找到命名参数: " + name);
}
4 String方法扩展
public static string jQueryStringFormat(this String @this, string sjQueryStringT, object oValue)
{ //检测验证
if (string.IsNullOrEmpty(sjQueryStringT))
return sjQueryStringT;
if (!sjQueryStringT.Contains(__prefix))
throw new Exception("字符串中变量不包含$前缀");
if (oValue == null)
return sjQueryStringT; //解析
//need using System.Linq;
var variables = GetEnumerateVariables(sjQueryStringT).ToArray();
foreach (string vname in variables)
{
//获取值
string vvalue = ValueForName(oValue, vname).ToString();
//字符串替换
sjQueryStringT = sjQueryStringT.Replace("$" + vname, vvalue); }
return sjQueryStringT;
}
5 单元测试
其实在VS2012中可以自动生成单元测试代码,然后稍加改动就可以对编写的方法进行单元测试,非常方便
/// <summary>
///jQueryStringFormat 的测试
///</summary>
[TestMethod()]
public void jQueryStringFormatTest()
{
string @this = ""; // TODO: 初始化为适当的值 string Name = "JackWang";
int ID = ;
string sjQueryStringT = "exec func($Name,$$ID)"; // TODO: 初始化为适当的值
object oValue = new { ID, Name }; // TODO: 初始化为适当的值
string expected = "exec func(JackWang,$100)"; // TODO: 初始化为适当的值
string actual;
actual = StringFormat.jQueryStringFormat(@this, sjQueryStringT, oValue);
Assert.AreEqual(expected, actual);
//Assert.Inconclusive("验证此测试方法的正确性。");
}
6 应用示范
string Name = "jack";
int ID = ;
string template = "exec func($Name,$ID)";
string parseText = template.jQueryStringFormat(template, new { ID, Name });
也可以传入一个类的实例
template = "the $Name who ID is $$ID";
parseText = template.jQueryStringFormat(template, new Person { ID = "", Name = "JackWang" });
7 GitHub开源
项目源码放于GitHub中https://github.com/JackWangCUMT/jQueryStringFormat
C#实现类似"hello $world"的格式化字符串方法的更多相关文章
- WPF中Binding使用StringFormat格式化字符串方法
原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...
- JavaScript ES6格式化字符串方法
js想要动态更新文本内容,在ES5中没有格式化字符串的方法,在ES6中是有字符串格式化的方法的. 使用左上角数字1旁边的符号定义字符串.先定义好需要拼接的字符串,在字符串内部使用 ${变量名} 进行拼 ...
- Python的3种格式化字符串方法
Python中有3种format字符串的方式: 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world&qu ...
- [转]Python的3种格式化字符串方法
本文转自: 夏日微风Python笔记 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world" y ...
- Qt sprintf_s函数格式化字符串出错
Qt sprintf_s函数格式化字符串出错 问题的出现: 我在VS上用c C++写的跨平台的函数 移植到Qt 上面 出现sprintf_s 函数格式化出错. 开始以为是编码问题 反复查找Qt乱码问 ...
- JavaScript 实现格式化字符串函数String.format (解决引号嵌套转义符问题)
在js开发中,我们可能会遇到这样一个问题 当需要通过js动态插入html标签的时候 特别是当遇到大量的变量拼接.引号层层嵌套的情况,会出现转义字符问题,经常出错 我们来看个例子 <!DOCTYP ...
- VBA 格式化字符串 - Format大全
VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...
- sprintf格式化字符串带来的注入隐患
原文链接:https://paper.seebug.org/386/ 摘要点关键知识点 <?php $input = addslashes("%1$' and 1=1#"); ...
- python 使用json.dumps() 的indent 参数,获得漂亮的格式化字符串后输出
想获得漂亮的格式化字符串后输出,可以使用json.dumps() 的indent 参数.它会使得输出和pprint() 函数效果类似 >>> data {'age': 4, 'nam ...
随机推荐
- [OpenCV] Samples 04: contours2
要先变为二值图像:cvThreshold 提取轮廓:cvFindContours #include "opencv2/imgproc/imgproc.hpp" #include & ...
- Android中的内存储、外存储概念、文件操作与PC端的有些不同
其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.初学者在这部分感到很容易混 ...
- exp/imp 参数说明,中英对照
在任意可用exp/imp(导出/导入)命令的主机上,都可以通过exp/imp help=y查看所有的参数说明. 1.exp参数说明 2.imp参数说明 3.exp参数说明(中文) 4.imp参数说明( ...
- Windows Azure HandBook (9) Azure性能测试(2)
<Windows Azure Platform 系列文章目录> 在上一节中,笔者介绍了我们在Azure性能测试之前,首先需要提交<渗透性测试表> Windows Azure H ...
- Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site
<Windows Azure Platform 系列文章目录> 熟悉Azure Web Site平台的读者都知道,我们可以通过FTP等方式,把本地的Web Application部署到微软 ...
- vs2015使用GIt连接git.oschina.net/
本文转自:http://www.bubuko.com/infodetail-1066588.html.谢谢作者 先安装Git命令行,下载地址:https://github.com/git-for-wi ...
- SQL Server代理(4/12):配置数据库邮件
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在以前的文章里我们看到,SQL Serve ...
- WinForm,MVC知识点
WinForm的一些基础知识,用来回忆自己遗忘的,唤醒自己的知识. 虽然现在有MVC但是我觉得还是要学习一下WinForm的,毕竟以前也被大家用了好多年. 基础知识01 1:一个控件有很多的事件,每个 ...
- 自己对Debug的一些感悟
A.13-03-06记. 1.当项目中发现bug的时候,首先考虑如何重现,能够重现的bug比较好找寻根源. 2.思考下以前是否发现过类似bug,是否由一些外部配置所决定. 3.有循环时候注意临界条件.
- C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler
前面一篇里提到事件是通过委托来进行关联的,而委托是可以带各种各样的参数的,其中就可以用事件参数(EventArgs),同时,也可以用.Net框架里边提供的一个委托EventHandler来Handle ...