C# 如何提取两个字符之间的字符串?
我有字符串模板,可以在以下3种形式中的任何一种。如何提取括在括号之间的字符串列表?我需要所有这些字符串的输出都是相同的C# 如何提取两个字符之间的字符串?,c#,asp.net-core,C#,Asp.net Core,我有字符串模板,可以在以下3种形式中的任何一种。如何提取括在括号之间的字符串列表?我需要所有这些字符串的输出都是相同的 {CustID}, {Name}, {Contact}, {Address1}, {Address2} 示例: /Customer/Initiation/{CustID}?Name={Name}&Contact={Contact}&Address1={Address1}&Address2={Address2} /Customer/Initiation
{CustID}, {Name}, {Contact}, {Address1}, {Address2}
示例:
/Customer/Initiation/{CustID}?Name={Name}&Contact={Contact}&Address1={Address1}&Address2={Address2}
/Customer/Initiation/{CustID}/{Name}?Contact={Contact}&Address1={Address1}&Address2={Address2}
/Customer/Initiation/{CustID}/{Name}/{Contact}?Address1={Address1}&Address2={Address2}
我发现asp net核心中有一个实用程序,它可以解析查询字符串并生成键/值对列表。但是在我的例子中,它不能解析url模板中不是键/值格式的{string}。有没有一种不用正则表达式就可以实现的方法
Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery()
谢谢你的建议 您可以使用正则表达式查找文本的所需部分:
var test = Regex.Matches(yourString, @"{\w+}");
foreach(var t in test)
{
Console.WriteLine(t);
}
可以使用正则表达式查找文本的所需部分:
var test = Regex.Matches(yourString, @"{\w+}");
foreach(var t in test)
{
Console.WriteLine(t);
}
好的,因为您指定了不带
Regex
,所以可以使用和的组合从源字符串中解析模板。它可能看起来像这样
private static IEnumerable<string> ParseTemplates(string source)
{
if (source is null)
{
throw new ArgumentNullException(nameof(source)); //Or an empty enumerable.
}
var result = new List<string>();
int currentIdx = 0;
while ((currentIdx = source.IndexOf('{', currentIdx)) > -1)
{
int closingIdx = source.IndexOf('}', currentIdx);
if (closingIdx < 0)
{
throw new InvalidOperationException($"Parsing failed, no closing brace for the opening brace found at: {currentIdx}");
}
result.Add(source.Substring(currentIdx, closingIdx - currentIdx + 1));
currentIdx = closingIdx;
}
return result;
}
私有静态IEnumerable解析模板(字符串源)
{
if(源为空)
{
抛出新ArgumentNullException(nameof(source));//或空枚举。
}
var result=新列表();
int currentIdx=0;
而((currentIdx=source.IndexOf('{',currentIdx))>-1)
{
int closingIdx=source.IndexOf('}',currentIdx);
if(closingIdx<0)
{
抛出新的InvalidOperationException($”分析失败,在{currentIdx}处找不到左大括号的右大括号);
}
添加(source.Substring(currentIdx,closingIdx-currentIdx+1));
currentIdx=closingIdx;
}
返回结果;
}
好吧,因为您指定了不带正则表达式的模板,所以可以使用和的组合从源字符串中解析模板。它可能看起来像这样
private static IEnumerable<string> ParseTemplates(string source)
{
if (source is null)
{
throw new ArgumentNullException(nameof(source)); //Or an empty enumerable.
}
var result = new List<string>();
int currentIdx = 0;
while ((currentIdx = source.IndexOf('{', currentIdx)) > -1)
{
int closingIdx = source.IndexOf('}', currentIdx);
if (closingIdx < 0)
{
throw new InvalidOperationException($"Parsing failed, no closing brace for the opening brace found at: {currentIdx}");
}
result.Add(source.Substring(currentIdx, closingIdx - currentIdx + 1));
currentIdx = closingIdx;
}
return result;
}
私有静态IEnumerable解析模板(字符串源)
{
if(源为空)
{
抛出新ArgumentNullException(nameof(source));//或空枚举。
}
var result=新列表();
int currentIdx=0;
而((currentIdx=source.IndexOf('{',currentIdx))>-1)
{
int closingIdx=source.IndexOf('}',currentIdx);
if(closingIdx<0)
{
抛出新的InvalidOperationException($”分析失败,在{currentIdx}处找不到左大括号的右大括号);
}
添加(source.Substring(currentIdx,closingIdx-currentIdx+1));
currentIdx=closingIdx;
}
返回结果;
}
这只是一个想法,如果您试图通过Web API实现这一点,并且您正在创建特定的端点,那么您可以通过RouteAttribute和FromQueryAttribute实现这一点。我之所以这样写,是因为您似乎正在使用query paramscheck处理不同的资源在第二个答案中去掉解析代码这里有什么原因您不想使用Regex
?没有,没有理由不使用Regex。我只是想知道是否有来自.NETFramework的实用程序。如果Regex是更好的选择,我会选择它。谢谢只是一个想法,如果您试图通过Web API实现它,并且您正在创建特定的端点,那么您可以通过RouteAttribute和FromQueryAttribute来实现。我之所以这样写,是因为您似乎正在使用query paramscheck处理不同的资源在第二个答案中去掉解析代码这里有什么原因您不想使用Regex
?没有,没有理由不使用Regex。我只是想知道是否有来自.NETFramework的实用程序。如果Regex是更好的选择,我会选择它。谢谢使用正则表达式真的很难做到“不使用正则表达式”(如OP发布的):-)使用正则表达式真的很难做到“不使用正则表达式”(如OP发布的):-)