我有一个带3个参数的函数。第一个参数可能包含一个百搭字符(“*”),第二个参数是一个普通字符串,而第三个参数是一个百搭字符“*”。该函数的主要议程是:通过Regex.Match()比较前两个字符串并返回:
1. null, if 1st two strings do not match at all.
2. Fetches and returns index from 2nd string.
3. Returns empty if both strings match completely.
功能如下:
static string GetIndex(string value, string stringToCompare, string wildCard)
{
var match = Regex.Match(stringToCompare, string.Format("^{0}$", value.Replace(wildCard, @"(?<index>\d+)")), RegexOptions.IgnoreCase);
if (match == null || !match.Success) return null;
return match.Groups["index"].Value;
}
功能适用于:
a. var a = GetIndex("PCONND*_DHEIGHT", "PCONND2_DHEIGHT", "*"); //Result:"2"
b. var a = GetIndex("CYL1_TYPE", "CYL1_TYPE", "*"); //Result: ""
但不起作用:
a. var a = GetIndex("CTOT(1)", "CTOT(1)", "*");
我知道,Regex.Escape()可用于转义字符,但不能在此处应用,以便我的所有上述案例都可以成功验证。
答案 0 :(得分:2)
模式CTOT(1)
正在使用捕获组,因此与CTOT(1)
不匹配。您需要转义括号才能获得匹配CTOT\(1\)
或者您可以使用
检查完整匹配 if (value.Equals(stringToCompare)) return "";
根据您的要求,您可以删除Regex.Match。这种替代方法假设通配符仅用于单个数字值:
public string GetIndex(string value, string stringToCompare, char wildcard)
{
bool stringsMatch = true;
for (int i = 0; i < value.Length; i++)
{
//wild card match - return the value in stringTocompare
if (value[i] == wildcard)
{
return stringToCompare[i].ToString();
}
else if (value[i] != stringToCompare[i]) //strings don't match
{
stringsMatch = false;
}
}
return stringsMatch ? "" : null;
}
这是一个你需要处理stringToCompare
更短的例子。
答案 1 :(得分:2)
如果您想将所有getMessage()
视为数字占位符并将所有其他字符视为字面值,您可能仍然依赖于*
方法,该方法在所有考虑的字符前面添加字面反斜杠一些正则表达式元字符,运算符。
因此,在使用该方法后,所有Regex.Escape
都将被转义。因此,只需替换*
+您的\
,以确保正确准备搜索模式:
wildCard
请参阅C# demo。
我修改的部分是static string GetIndex(string value, string stringToCompare, string wildCard)
{
var match = Regex.Match(stringToCompare, string.Format("^{0}$", Regex.Escape(value).Replace($@"\{wildCard}", @"(?<index>\d+)")), RegexOptions.IgnoreCase);
if (match == null || !match.Success) return null;
return match.Groups["index"].Value;
}
,其中Regex.Escape(value).Replace($@"\{wildCard}", @"(?<index>\d+)"))
首先被转义,然后所有value
都被\*
替换。