Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 如何将字符串修剪到第一个出现的“a”;&引用;或一个;[quot;_C#_Regex - Fatal编程技术网

C# 如何将字符串修剪到第一个出现的“a”;&引用;或一个;[quot;

C# 如何将字符串修剪到第一个出现的“a”;&引用;或一个;[quot;,c#,regex,C#,Regex,我有这样的c#字符串: "かたむく;かたぶく[ok]" "そば[側,傍];そく[側];はた" "くすり" "おととい[gikun];おとつい[gikun];いっさくじつ" 如何对这些字符串进行精简,使输出仅包含第一次出现“;”字符(不是普通分号)或“[”之前的文本,或者如果两者都不存在,则新字符串将与现有字符串相同 "かたむく" "そば" "くすり" "おととい" 这是使用正则表达式最好的方法,还是我应该使用某种类型的代码索引来实现这一点?您不需要Regex,只需要string.IndexO

我有这样的c#字符串:

"かたむく;かたぶく[ok]"
"そば[側,傍];そく[側];はた"
"くすり"
"おととい[gikun];おとつい[gikun];いっさくじつ"
如何对这些字符串进行精简,使输出仅包含第一次出现“;”字符(不是普通分号)或“[”之前的文本,或者如果两者都不存在,则新字符串将与现有字符串相同

"かたむく"
"そば"
"くすり"
"おととい"

这是使用正则表达式最好的方法,还是我应该使用某种类型的代码索引来实现这一点?

您不需要
Regex
,只需要
string.IndexOfAny
。类似于:

 var inputs = new[]
 {
     "かたむく;かたぶく[ok]",
     "そば[側,傍];そく[側];はた",
     "くすり",
     "おととい[gikun];おとつい[gikun];いっさくじつ"
 };

 var separators = new[] {' ', '['};

 foreach (var input in inputs)
 {
     var separatorPosition = input.IndexOfAny(separators);
     if (separatorPosition >= 0)
     {
         Debug.WriteLine($"Split: {input.Substring(0, separatorPosition)}");
     }
     else
     {
         Debug.WriteLine($"No Split: {input}");
     }

 }
我从您的输入中获得以下输出:

Split: かたむく;かたぶく
Split: そば
No Split: くすり
Split: おととい

它与您显示的内容不太匹配,但我认为它是正确的(您显示的内容也不正确)

扩展我的评论,“
IndexOf
可用于查找
[
字符的第一个索引,
子字符串可以返回到该点。”

要使用多个delimeter执行此操作,我们可以传入delimeter字符数组并使用
索引

public static string GetSubstringToChar(string input, char[] delimeters)
{
    if (input == null || !input.Any(delimeters.Contains)) return input;
    return input.Substring(0, input.IndexOfAny(delimeters));
}
你可以这样称呼它:

var strings = new List<string>
{
    "かたむく;かたぶく[ok]",
    "そば[側,傍];そく[側];はた",
    "くすり",
    "おととい[gikun];おとつい[gikun];いっさくじつ",
};

var delimeters = new[] { ';', '[' };

foreach (var str in strings)
{
    Console.WriteLine(GetSubstringToChar(str, delimeters));
}
var strings=新列表
{
"かたむく;かたぶく[好]“,
"そば[側,傍];そく[側];はた",
"くすり",
"おととい[吉昆]おとつい[吉昆]いっさくじつ",
};
变量delimeters=new[]{';','['};
foreach(字符串中的var str)
{
Console.WriteLine(GetSubstringToChar(str,delimeters));
}

一个带有少量验证的扩展方法可以完成这项工作

public static string GetUntil(this string input, char[] delimiters)
{
   if (input == null || input.IndexOfAny(delimiters) == -1)
      return input;
   else
      return input.Split(delimiters)[0];
}
然后像这样打电话:

var test = "かたむく;かたぶく[ok]".GetUntil(new char[] { ' ', '[' });

您尝试了什么,哪些不起作用?我相信,当您向我们展示您的尝试时,我们会提供帮助并提供解决方案。类似于return的代码かたむく“
完全按照您的要求执行。如果这不正确,您需要解释如何“修剪”这些字符串。
IndexOf
可用于查找
[
字符的第一个索引,
Substring
可将字符串返回到该点。使用字符串方法。获取IndexOf([”),然后使用Substring(startindex)在括号后返回字符。老实说,我真的不明白答案。OP没有向我们展示任何东西,但我们蜂拥而至地抛出自以为是的答案。我们不知道OP在用什么,所以我们如何才能正确地确定其中任何一个是否与OP的工作内容相符?只是我的观点和想法。嗨,你能澄清哪一个是不正确的吗?我需要你的第一个例子来看看“かたむく“第一个,你在看起来像冒号的东西上拆分(即,在看起来小于的字符上结束)。我不使用
索引
,你可以使用
拆分
,这样做会更简洁。
foreach(输入中的var输入){Debug.WriteLine(输入.拆分(分隔符).first();}”
。哦,我现在明白你的意思了,这是一个“character@Alan2如果要使用
而不是空格字符进行拆分,请在
分隔符
数组中使用该字符。有什么问题吗?谢谢,我如何使“;”也作为一个除数,使其对“[”或“"您可以将
IndexOfAny
与字符数组一起使用。我已经更新了示例代码。谢谢,我以前没有听说过IndexOfAny。我认为这非常有用。
IndexOfAny
检查是多余的。您可以安全地删除它,因为
Split
会在没有找到任何分隔符的情况下返回整个字符串。此外,IMO,如果调用方为null,则返回null的扩展方法不是一个好的做法。我会让
NullReferenceException
完成它的工作。我对“IndexOfAny”的推理是提高拆分操作的性能。
var test = "かたむく;かたぶく[ok]".GetUntil(new char[] { ' ', '[' });