【发布时间】:2017-06-08 11:58:43
【问题描述】:
我正在接受一个输入字符串,我希望它是一个适用于字符串的三元语句。所以我的方法签名看起来像这样:
public string Parse(string value, string ternaryStatement)
并且有参数会给出这些结果:
Parse(null, "=?It's Null:It's Not Null") == "It's Null" // Empty string would
Parse("", "=?It's Null:It's Not Null") == "It's Null" // be same as null
这个例子比较简单,先用'?'分割字符串然后通过':'
但我当然需要一种方法来处理转义字符,“\”、“\?”和“:”,其中“\”在任何地方都有效,“\?”只会在第一个未转义的“?”之前有效并且“:”仅在相同的“?”之后才有效。
Parse(@"\?\", @"=\\\?\\?\:Match\::\:No Match\:") == ":Match:"
Parse(@"\?\", @"!=\\\?\\?\:No Match\::\:Match\:") == ":Match:"
但这真的很复杂。我相信我可以使用正则表达式来执行它,但这只会产生另一个问题,因为这远远超出了我对正则表达式的有限理解。解决这个问题的最佳方法是什么?
编辑 1
一些背景知识:我将 URL 的格式存储在数据库配置表中(实际上是 Dynamics 365 for Customer Engagement,但此时无关紧要)。格式存储为字符串,所需的参数在代码中定义。所以一般情况下是这样的:
格式:“https://something.com?Foo={0}&Bar={1}”
描述:“0 - Foo, 1 - Bar”
描述用于格式化 url 的人和需要知道如何构造格式语句的开发人员。
我现在遇到的问题是我的 url 至少需要两个不同参数之一。如果其中一个值为 null 或为空,则如果包含在 url 中,则会出错。所以我需要一种说法,如果 Foo 为 null 或 Bar 为 null,则不要包含名称或 &。理想情况下,我想这样实现:
"https://something.com?{0:=?:Foo={{0}}}&}{1:=?:Bar={{1}}}}"
所以如果 Foo 为 null 而 Bar 为 "Bar" 则输出为
"https://something.com?Bar=Bar"
如果我们需要在布尔值的 0/1 和 true/false 之间切换而无需更改代码,我也可以看到它正在使用:
"https://something.com?{0:=0?false:true}"
【问题讨论】:
-
为什么要这样做?给我们一些背景信息,说明为什么这对您有用。
-
@mjwills 我正在尝试创建一个字符串格式化程序来处理空值等...所以
Format("{0:=?My Default Value:{{0}}}", value)我不能将该逻辑作为格式调用的参数,因为我需要它由字符串本身定义,我没有方法可以包含另一个默认字符串作为参数。 -
您能否分享更多示例输入和输出?我仍在努力理解根本问题。我很抱歉。
-
@mjwills 更新有帮助吗?
-
鉴于您的更新,也许最好看看 UriBuilder 吗? stackoverflow.com/a/14517976/361842