C# 如何通过省略字符串的某些部分来验证或比较字符串
我有一个字符串如下 “a1/type/xyz/parts” 存在“xyz”的零件是动态的,并且在任何尺寸下都会相应变化。我只想比较两个字符串是否相等,完全丢弃'xyz'部分 例如,我有如下字符串 “a1/类型/abcd/parts” 那么我的比较必须成功 我尝试使用正则表达式,如下所示。虽然我对正则表达式的了解有限,但它不起作用。可能是我使用的方式有问题C# 如何通过省略字符串的某些部分来验证或比较字符串,c#,string,C#,String,我有一个字符串如下 “a1/type/xyz/parts” 存在“xyz”的零件是动态的,并且在任何尺寸下都会相应变化。我只想比较两个字符串是否相等,完全丢弃'xyz'部分 例如,我有如下字符串 “a1/类型/abcd/parts” 那么我的比较必须成功 我尝试使用正则表达式,如下所示。虽然我对正则表达式的了解有限,但它不起作用。可能是我使用的方式有问题 var regex = @"^[a-zA-Z]{2}/\[a-zA-Z]{16}/\[0-9a-zA-Z]/\[a-z]{5}/$"; var
var regex = @"^[a-zA-Z]{2}/\[a-zA-Z]{16}/\[0-9a-zA-Z]/\[a-z]{5}/$";
var result = Regex.Match("mystring", regex).Success;
另一个想法是得到第一部分和最后一部分的子字符串,省略不需要的部分并进行比较
通过使用有效代码丢弃字符串的某些部分,比较应该是成功的
比较成功案例
string1:“a1/type/21412ghh/parts”
string2:“a1/类型/EEEEE 122GHH/零件”
比较失败案例:
string1:“a1/type/21412ghh/parts”
弦2:“a2/型/EEEEE 122GHH/件/mm”
简而言之,“a1/type/abcd/parts”在字符串的这一部分,非粗体部分始终是静态的 老实说,您可以使用正则表达式来实现这一点,然后拆开字符串。但是您有一个指定的分隔符,只需使用
String.Split
:
bool AreEqualAccordingToMyRules(string input1, string input2)
{
var split1 = input1.Split('/');
var split2 = input2.Split('/');
return split1.Length == split2.Length // strings must have equal number of sections
&& split1[0] == split2[0] // section 1 must match
&& split1[1] == split2[1] // section 2 must match
&& split1[3] == split2[3] // section 4 must match
}
您可以尝试
Split
(获取零件)和Linq(排除三维零件)
下面是一个使用字符串函数比较中间部分前后部分的小程序:
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(CutOutMiddle("a1/type/21412ghh/parts"));
Console.WriteLine("True: " + CompareNoMiddle("a1/type/21412ghh/parts", "a1/type/21412ghasdasdh/parts"));
Console.WriteLine("False: " + CompareNoMiddle("a1/type/21412ghh/parts", "a2/type/21412ghh/parts/someval"));
Console.WriteLine("False: " + CompareNoMiddle("a1/type/21412ghh/parts", "a1/type/21412ghasdasdh/parts/someappendix"));
}
private static bool CompareNoMiddle(string s1, string s2)
{
var s1CutOut = CutOutMiddle(s1);
var s2CutOut = CutOutMiddle(s2);
return s1CutOut == s2CutOut;
}
private static string CutOutMiddle(string val)
{
var fistSlash = val.IndexOf('/', 0);
var secondSlash = val.IndexOf('/', fistSlash+1);
var thirdSlash = val.IndexOf('/', secondSlash+1);
var firstPart = val.Substring(0, secondSlash);
var secondPart = val.Substring(thirdSlash, val.Length - thirdSlash);
return firstPart + secondPart;
}
}
返回
a1/type/parts
True: True
False: False
False: False
正如其他人所说,这个解决方案应该涵盖您的情况,如果您有分隔符,请使用它。在下面的函数中,如果(arrayStringOne[i]==ignore)继续,您可以为
字符串忽略
或类似的内容更改int skip
,并在比较循环中更改代码>
public bool Compare(string valueOne, string valueTwo, int skip) {
var delimiterOccuranceOne = valueOne.Count(f => f == '/');
var delimiterOccuranceTwo = valueTwo.Count(f => f == '/');
if(delimiterOccuranceOne == delimiterOccuranceTwo) {
var arrayStringOne = valueOne.Split('/');
var arrayStringTwo = valueTwo.Split('/');
for(int i=0; i < arrayStringOne.Length; ++i) {
if(i == skip) continue; // or instead of an index you could use a string
if(arrayStringOne[i] != arrayStringTwo[i]) {
return false;
}
}
return true;
}
return false;
}
Compare("a1/type/abcd/parts", "a1/type/xyz/parts", 2);
public bool比较(字符串值一、字符串值二、整数跳过){
var delimiterOccuranceOne=valueOne.Count(f=>f=='/');
var delimiterOccuranceTwo=valueTwo.Count(f=>f=='/');
if(delimiterOccuranceOne==delimiterOccuranceTwo){
var arrayStringOne=valueOne.Split('/');
var arrayStringTwo=valueTwo.Split('/');
对于(int i=0;i
a1/type/abcd/xyz/parts成功了吗?您可以发布更多的测试用例吗?不应该。只有xyz、abc部分保持变化。字符串的其余部分是常量,但在编译时未知,不是吗?总是有4个块吗?始终用/
分隔?动态零件始终是第三个零件?这不会比较/parts
->a1/type/21412ghh/parts
和a1/type/21412ghh/parts/valval
之后的最后一个零件/mm
match@Chrᴉz根据问题,这些测试不应通过(参见比较失败案例)
public bool Compare(string valueOne, string valueTwo, int skip) {
var delimiterOccuranceOne = valueOne.Count(f => f == '/');
var delimiterOccuranceTwo = valueTwo.Count(f => f == '/');
if(delimiterOccuranceOne == delimiterOccuranceTwo) {
var arrayStringOne = valueOne.Split('/');
var arrayStringTwo = valueTwo.Split('/');
for(int i=0; i < arrayStringOne.Length; ++i) {
if(i == skip) continue; // or instead of an index you could use a string
if(arrayStringOne[i] != arrayStringTwo[i]) {
return false;
}
}
return true;
}
return false;
}
Compare("a1/type/abcd/parts", "a1/type/xyz/parts", 2);