C# 从字符串的第二行开始,从-till开始

C# 从字符串的第二行开始,从-till开始,c#,string,C#,String,我需要从字符串中取第二行,从'\r'开始,直到下一个'\r'字符 这是我的字符串中的一个示例 string str = "@b\r210.190\r\000.000\r\n"; 我需要获取值210.190,但里面没有'\r'字符。尝试使用Split: string str = "@b\r210.190\r\000.000\r\n"; string result = str .Split(new char[] { '\r' }, 3) // split on 3 items

我需要从
字符串
中取第二行,从
'\r'
开始,直到下一个
'\r'
字符

这是我的字符串中的一个示例

string str = "@b\r210.190\r\000.000\r\n";

我需要获取值
210.190
,但里面没有
'\r'
字符。

尝试使用
Split

  string str = "@b\r210.190\r\000.000\r\n";

  string result = str
    .Split(new char[] { '\r' }, 3)  // split on 3 items at most
    .Skip(1)                        // skip the 1st item 
    .FirstOrDefault();              // take the second item if exists (null if not)
编辑:如果是任意
字符串
s(很可能是
null
或包含10亿个字符),我建议
IndexOf
子字符串
(因为
Split
创建了一个可能不需要的数组):

int from=str==null-1:str.IndexOf('\r');
整数长度=从<0-1:str.IndexOf('\r',from+1)-from;
字符串结果=长度>=0?str.Substring(from+1,length):空;
我建议使用,但我认为Dmitry Bychenko的回答可以更简单:

string result = str.Split('\r')[1];
这是一个在线演示:

作为Dmitry Bychenko,这可能会导致创建一个长数组,即使您只对第二项感兴趣。这可以通过将输出限制为三个匹配项来防止:

string result = str.Split(new char[] {'\r'}, 3)[1];

第一个参数看起来很复杂,但在同一个字符数组中,只有一个元素实际上在第一个版本中使用。(为了完整起见,更新的演示:)

您也可以使用正则表达式模式匹配。方法
Regex.Match
搜索指定正则表达式的第一个匹配项:

string str = "@b\r210.190\r\000.000\r\n";

var resultString = Regex.Match(str, @"(?<=\r).+?(?=\r)").Value;

Console.WriteLine(resultString + " " + resultString.Contains("\r"));
string str=“@b\r210.190\r\000.000\r\n”;

var resultString=Regex.Match(str,@)(?简单地按
\r
拆分
,并获取结果数组的第二项。请检查我找到的内容,并告诉我在使用它之前是否需要注意:str.Split(新字符[]{'\r','\n'},StringSplitOptions.RemoveEmptyEntries)[1];看起来不错-为什么不直接运行它并使用调试器检查它,或者更好:为包含此代码的方法创建一个单元测试。感谢您的回答,因为我可以看到它是有效的。@Wolf:如果初始字符串非常长,将fg拆分为
3
项只会更快:
Split('\r'))
可以很好地创建
100000
项的数组;
跳过(1)。FirstOrDefault()
返回
null
,如果原始字符串只有
1
项:
“abc”。拆分('\r')[1]
抛出
OutOfRangeException
感谢您的澄清。即使在正常情况下,您还是更喜欢使用此代码,还是应该使用看似简单的方法?@Wolf:如果我实现一个
private
方法,该方法使用的字符串保证短且至少有2项(如果我知道这些字符串的来源)我更喜欢您的解决方案。当上下文未知时,我更喜欢出于安全考虑。非常感谢。在构建于大量第二次匹配之上的生产代码中,我想您有一个专门的函数来保持代码紧凑;)在我看来,注释中不鼓励这样做。如果字符串格式不正确,则可能引发
OutOfRangeException
异常。为什么您更喜欢在具有明确错误处理的内容之前出现行为不正常的内容?@Default FirstOrDefault()没有明确的错误处理,如果没有元素,它只返回null。这里的函数是从定义的字符串中获取数据。如果调用方给出null而不是字符串,这两个方法都会失败,出现NullReferenceException->no clear error handling?有趣的方法,而检查输出中的
\r
可能(没有)提取本身的效率;)
string str = "@b\r210.190\r\000.000\r\n";

var resultString = Regex.Match(str, @"(?<=\r).+?(?=\r)").Value;

Console.WriteLine(resultString + " " + resultString.Contains("\r"));