客观
给出输入字符串n
,则返回该字符串是否为包含方案的Uri。本质上,我们提示用户提供一个字符串,并想确定它是否有一个方案。
我尝试过的事情
我从Uri.TryCreate
(documentation here)开始,期望这会给我带来方案(然后返回适当的布尔值)。而且大多数情况下都是这样。当Uri.TryCreate
输出有效的Uri时,有一个.Scheme
属性通常会返回该方案。
Input Returns
-----------------------------------------------
"http://www.test.com" --> "http"
为什么不起作用(我想要的方式) 尽管使用Uri的definition可能是完全正确的,但它“错误地”将没有方案的字符串标识为具有字符串的方案。示例:
Input Returns
-----------------------------------------------
"localhost:80" --> "localhost"
问题(如我所见)是,这不是一个可解决的问题。我们不知道此字符串是否表示名为localhost
的方案,或者该字符串是否未指定方案但使用的是:
(通常用于指定端口)。
但是,对于我来说,以我的示例为例,用户似乎更倾向于使用不使用localhost的方案来访问网站或localhost上的内容。
另一个SO答案建议使用UriBuilder,但它遇到的问题与我遇到的问题相同。
是否有更好的方法来处理?假设:
后跟数字,直到字符串的末尾或正斜杠表示端口号,并从字符串中删除该部分,是否更有意义? (例如,但我确定这不是很好)
var portRegEx = new Regex("^(.*)(:[0-9]+)/*(.*)");
var match = portRegEx.Match(url);
if (match.Success)
{
if (match.Groups.Count == 4)
url = match.Groups[1].Value + match.Groups[3].Value;
}
或者,我可以检查已知方案的特定类型。但这对于任何非标准方案都将失败。感觉应该有比这更好的方法。
我该怎么做呢?
样品
class Program
{
static void Main(string[] args)
{
PrintScheme("localhost:8000");
PrintScheme("localhost");
PrintScheme("http://test.com");
Console.Read();
}
static void PrintScheme(string uri)
{
Uri.TryCreate(uri, UriKind.Absolute, out var inputUri);
Console.WriteLine($"Input: {uri,-15} --> {inputUri?.Scheme ?? "No Scheme"}");
}
}
示例输出
Input: localhost:8000 --> localhost
Input: localhost --> No Scheme
Input: http://test.com --> http