比如我有一个格式化字符串
a-{0}-b-{1}
和一个已经被格式化的字符串
a-999-b-888
我如何反推出 string.Format 的
{0} 就是999
{1}就是888
可能我举的例子有点误导人
我重新举个例子:
有格式化字符串三个 :a-{0}-b-{1} ass{1}ass{0} b23{0}我{1}
有格式化后的字符串三个:a-1-b-你 ass你ass1 b231我你
我现在要单独的提取出 “1” “你”(就是传入的参数)
我的想法是从格式化字符串里面的 {0} {1}开始截断 截断后替换成 - 然后再用 -进行Split获得 传入参数的实际值
当然实际操作上可能要排些雷
话说这个 a-{0}-b-{1} 实际上是类似自定义邮件的功能
就是那种我给你{0} 是标题,{1}是名称,{2}是日期
然后由你自由组装拼成一句/段话的功能
比如我有这样一个配置:
{0}
{1}:你好,我是XXX公司,我要招聘你
{2}
然后我根据这个配置和我的数据得到下面内容
XX公司招聘通知
dudu:你好,我是XXX公司,我要招聘你
2020年12月
现在我要根据配置和内容提取出里面的
XX公司招聘通知 {0}
dudu {1}
2020年12月 {2}
这个配置是由用户来配置的,每个用户只能配置一次,但是每个用户的配置不一定一样
流程是这样的:
我配置了这样一个规则,然后发出去了这封邮件
然后我收到了这封邮件,然后我要根据规则和邮件获取到真实的值
【这只是个例子,我的脑子没问题
把格式化字符串 转换成字符正则表达式 ,去匹配 已经被格式化的字符串。
a-{0}-b-{1} =转为正则=> a-([\s\S]+?])-b-([\s\S]+?]) =匹配=> a-999-b-888 = 结果=> 结果集 mcs1
再用正则匹配 原格式化串: a-{0}-b-{1} =结果=>结果集 mcs2
结果集2记录的 格式化的字符的参数索引号:即:{0} {1}
结果集1记录的 是参数内容,即:999 888
结合两个集号,就可以把全部参数对应上了。
你按这个逻辑就对了。
{x} 换成 [\s\S]+? ,然后分别匹配,格式串,和结果串,两个结集对应起来,就是你要的结果了。
修正一下之前的提交:转换的正则应为:^a-([\s\S]+?)-b-([\s\S]+?)$
https://the-x.cn/RegularExpressions.aspx 送你个正则工具,支持结果分组
用正则表达式匹配 "a-(\d+)-b-(\d+)"
如果格式化从
a-{0}-b-{1}
变成了
c-{0}-d-{1}
那我不就要重改一遍正则?
我的想法是通用的,就是只要给我 a-{0}-b-{1} 和 a-999-b-888 我就能得到 999 和 888
不用去关心这次是 a-{0}-b-{1} 下次是 c-{0}-d-{1}
@敲键听响: 要么通过元数据,要么通过规则,不然即使是福尔摩斯也反推不出来。
@dudu: 可能我举的例子有点误导人
我重新举个例子:
有格式化字符串三个 :a-{0}-b-{1} ass{1}ass{0} b23{0}我{1}
有格式化后的字符串三个:a-1-b-你 ass你ass1 b231我你
我现在要单独的提取出 “1” “你”(就是传入的参数)
我的想法是从格式化字符串里面的 {0} {1}开始截断 截断后替换成 - 然后再用 -进行Split获得 传入参数的实际值
当然实际操作上可能要排些雷
@敲键听响: 那为什么不直接用正则表达式?
@dudu:
o(╥﹏╥)o
因为我不会写吖
@dudu: 只能用代码来解决了
@敲键听响: 业务需要变化,正则也需要变化,那么我们以前是把 正则表达式作为一个配置项的
@数据酷软件: 其实按你这样也是没问题
但关键是这个配置是甲方来做的
没法保证甲方就会正则
@敲键听响: a-(\d+)-b-(\d+) a,b会改变,但是这个结构不改变吧 把a,b 这两个值 给用户去负责,这样不行嘛?
@Cgrain: 结构也会变...
你看我问题补充里面举得三个例子
实际上三个都不一样
spilt("-") , 然后取出 1,3,这样 ?
可能我举的例子有点误导人
我重新举个例子:
有格式化字符串三个 :a-{0}-b-{1} ass{1}ass{0} b23{0}我{1}
有格式化后的字符串三个:a-1-b-你 ass你ass1 b231我你
我现在要单独的提取出 “1” “你”(就是传入的参数)
我的想法是从格式化字符串里面的 {0} {1}开始截断 截断后替换成 - 然后再用 -进行Split获得 传入参数的实际值
当然实际操作上可能要排些雷