Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过省略字符串的某些部分来验证或比较字符串_C#_String - Fatal编程技术网

C# 如何通过省略字符串的某些部分来验证或比较字符串

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

我有一个字符串如下

“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 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);