如何忽略参数值/定义比较两个URI/URL端点
忽略URI参数部分的字符串匹配实现
要让两个仅参数占位符/实际值不同的URI判定为相等,核心思路是统一处理掉URI中的参数变量部分,再进行比较。以下是两种实用的实现方式:
方法一:正则替换参数后比较
通过正则表达式匹配URI中的参数占位符(如{projectName})和对应位置的实际参数值(如XXX),将它们替换为统一标记后再做字符串相等校验。
using System.Text.RegularExpressions; public bool MatchUris(string uriA, string uriB) { // 正则规则:匹配 {参数名} 格式的占位符,或/statuses前的参数值段 var paramRegex = new Regex(@"{[^}]+}|(?<=/)[^/]+(?=/statuses$)"); // 替换两个URI的参数部分为统一字符串 var processedA = paramRegex.Replace(uriA, "PLACEHOLDER"); var processedB = paramRegex.Replace(uriB, "PLACEHOLDER"); return string.Equals(processedA, processedB); } // 调用示例 var uri1 = "/rest/api/projects/{projectName}/statuses"; var uri2 = "/rest/api/projects/XXX/statuses"; bool isMatch = MatchUris(uri1, uri2); // 返回true
方法二:按路径段逐个校验
将URI按斜杠拆分为路径段,逐个比对:如果对应位置的段一个是参数占位符、另一个是实际值,则跳过校验;其余段必须完全一致。这种方法适配参数在任意位置的场景。
public bool MatchUrisBySegments(string uriA, string uriB) { // 拆分URI为非空路径段 var segmentsA = uriA.Split('/').Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); var segmentsB = uriB.Split('/').Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); // 路径段数量不一致直接返回不匹配 if (segmentsA.Length != segmentsB.Length) return false; for (int i = 0; i < segmentsA.Length; i++) { var segA = segmentsA[i]; var segB = segmentsB[i]; // 判断当前段是否为参数占位符 bool isParamSeg = (segA.StartsWith("{") && segA.EndsWith("}")) || (segB.StartsWith("{") && segB.EndsWith("}")); // 非参数段必须完全相等 if (!isParamSeg && !segA.Equals(segB, StringComparison.Ordinal)) return false; } return true; } // 调用示例 var uri1 = "/rest/api/projects/{projectName}/statuses"; var uri2 = "/rest/api/projects/XXX/statuses"; bool isMatch = MatchUrisBySegments(uri1, uri2); // 返回true
内容的提问来源于stack exchange,提问作者Arsen Khachaturyan
相关产品推荐
相关产品推荐

