首页 新闻 搜索 专区 学院

如何反推出 string.Format 的参数

0
悬赏园豆:50 [已解决问题] 解决于 2020-03-08 14:05

比如我有一个格式化字符串

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}
这个配置是由用户来配置的,每个用户只能配置一次,但是每个用户的配置不一定一样
流程是这样的:
我配置了这样一个规则,然后发出去了这封邮件
然后我收到了这封邮件,然后我要根据规则和邮件获取到真实的值
【这只是个例子,我的脑子没问题

敲键听响的主页 敲键听响 | 初学一级 | 园豆:116
提问于:2020-03-01 17:10
< >
分享
最佳答案
0

把格式化字符串 转换成字符正则表达式 ,去匹配 已经被格式化的字符串。
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
结合两个集号,就可以把全部参数对应上了。

收获园豆:50
pencile | 小虾三级 |园豆:798 | 2020-03-04 09:44

你按这个逻辑就对了。
{x} 换成 [\s\S]+? ,然后分别匹配,格式串,和结果串,两个结集对应起来,就是你要的结果了。

修正一下之前的提交:转换的正则应为:^a-([\s\S]+?)-b-([\s\S]+?)$

pencile | 园豆:798 (小虾三级) | 2020-03-04 13:10

https://the-x.cn/RegularExpressions.aspx 送你个正则工具,支持结果分组

pencile | 园豆:798 (小虾三级) | 2020-03-04 13:20
其他回答(2)
1

用正则表达式匹配 "a-(\d+)-b-(\d+)"

dudu | 园豆:37094 (高人七级) | 2020-03-01 17:22

如果格式化从
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}

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-01 17:26

@敲键听响: 要么通过元数据,要么通过规则,不然即使是福尔摩斯也反推不出来。

支持(1) 反对(0) dudu | 园豆:37094 (高人七级) | 2020-03-01 17:44

@dudu: 可能我举的例子有点误导人
我重新举个例子:
有格式化字符串三个 :a-{0}-b-{1} ass{1}ass{0} b23{0}我{1}
有格式化后的字符串三个:a-1-b-你 ass你ass1 b231我你
我现在要单独的提取出 “1” “你”(就是传入的参数)
我的想法是从格式化字符串里面的 {0} {1}开始截断 截断后替换成 - 然后再用 -进行Split获得 传入参数的实际值
当然实际操作上可能要排些雷

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-01 17:54

@敲键听响: 那为什么不直接用正则表达式?

支持(1) 反对(0) dudu | 园豆:37094 (高人七级) | 2020-03-01 19:49

@dudu:
o(╥﹏╥)o
因为我不会写吖

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-01 19:50

@dudu: 只能用代码来解决了

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-01 19:51

@敲键听响: 业务需要变化,正则也需要变化,那么我们以前是把 正则表达式作为一个配置项的

支持(0) 反对(0) 数据酷软件 | 园豆:130 (初学一级) | 2020-03-02 09:49

@数据酷软件: 其实按你这样也是没问题
但关键是这个配置是甲方来做的
没法保证甲方就会正则

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-02 11:35

@敲键听响: a-(\d+)-b-(\d+) a,b会改变,但是这个结构不改变吧 把a,b 这两个值 给用户去负责,这样不行嘛?

@Cgrain: 结构也会变...
你看我问题补充里面举得三个例子
实际上三个都不一样

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-04 11:38
0

spilt("-") , 然后取出 1,3,这样 ?

混在园子里的底层码农 | 园豆:1403 (小虾三级) | 2020-03-01 17:46

可能我举的例子有点误导人
我重新举个例子:
有格式化字符串三个 :a-{0}-b-{1} ass{1}ass{0} b23{0}我{1}
有格式化后的字符串三个:a-1-b-你 ass你ass1 b231我你
我现在要单独的提取出 “1” “你”(就是传入的参数)
我的想法是从格式化字符串里面的 {0} {1}开始截断 截断后替换成 - 然后再用 -进行Split获得 传入参数的实际值
当然实际操作上可能要排些雷

支持(0) 反对(0) 敲键听响 | 园豆:116 (初学一级) | 2020-03-01 17:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册