如何从字符串 C# 中找到连字符的位置剥离字符串



我目前正在尝试剥离可能包含连字符符号的数据字符串。

E.g. Basic logic:
string stringin = "test - 9894"; OR Data could be == "test";
if (string contains a hyphen "-"){
Strip stringin;
output would be "test" deleting from the hyphen.
}
Console.WriteLine(stringin);

我正在尝试工作的当前 C# 代码如下所示:

    string Details = "hsh4a - 8989";
    var regexItem = new Regex("^[^-]*-?[^-]*$");
    string stringin;
    stringin = Details.ToString();
    if (regexItem.IsMatch(stringin)) {
    stringin = stringin.Substring(0, stringin.IndexOf("-") - 1); //Strip from the ending chars and - once - is hit.
    }
    Details = stringin;
    Console.WriteLine(Details);

但是当字符串不包含任何连字符时,会拉入错误。

这样做怎么样?

stringin.Split('-')[0].Trim();

您甚至可以使用重载Split构造函数指定子字符串的最大数量。

stringin.Split('-', 1)[0].Trim();

您的正则表达式要求"零个或一个重复的 -",这意味着即使您的输入不包含连字符,它也匹配。此后你这样做

stringin.Substring(0, stringin.IndexOf("-") - 1)

这给出了超出范围的索引异常(没有连字符可供查找)。

对正则表达式进行简单的更改,无论是否使用,它都可以使用 - 要求"一个或多个连字符":

var regexItem = new Regex("^[^-]*-+[^-]*$");
    here -------------------------^

如果原始字符串包含破折号('-'),则似乎希望(子)字符串'-'如果没有破折号,则原始字符串。如果是您的情况:

  String Details = "hsh4a - 8989";
  Details = Details.Substring(Details.IndexOf('-') + 1);
如果我

是你,我不会在这种情况下使用正则表达式,它使解决方案比它可能要复杂得多。对于字符串,我敢肯定不会超过几个破折号,我会使用此代码,因为它是一个行并且非常简单:

string str= entryString.Split(new [] {'-'}, StringSplitOptions.RemoveEmptyEntries)[0]; 

如果您知道一个字符串可能包含大量短划线,则不建议使用此方法 - 它将创建大量不同的字符串,尽管您只在寻找第一个。因此,解决方案将类似于以下代码:

int firstDashIndex = entryString.IndexOf("-");
string str = firstDashIndex > -1? entryString.Substring(0, firstDashIndex) : entryString;
你不需要

正则表达式。一个简单的 IndexOf 函数将为您提供连字符的索引,然后您可以从那里清理它。

这也是开始编写单元测试的好地方。它们非常适合这样的东西。

代码如下所示:

string inputString = "ho-something";
string outPutString = inputString;
            var hyphenIndex = inputString.IndexOf('-');
            if (hyphenIndex > -1)
            {
                outPutString = inputString.Substring(0, hyphenIndex);
            }
            return outPutString;

最新更新