我有这个字符串:
USERNAME: ADMIN|00004|GI FILE: Lorem ipsum dolor sit amet1.docx DETAIL:There was no endpoint listening at http://localhost:5557/
我想跳到 DETAIL:,结果只有:
There was no endpoint listening at http://localhost:5557/
如何在C#中实现这一目标?
答案 0 :(得分:5)
您可以使用字符串操作代替LINQ:
string substr = str.Substring(str.IndexOf("DETAIL:") + "DETAIL:".Length);
此代码假定字符串始终包含"DETAIL:"
作为子字符串。如果可能没有,那么你应该处理这种情况。计算成本最低的方法是检查str.IndexOf("DETAIL:")
是否不返回-1
。
string substr = null;
int pos = str.IndexOf("DETAIL:");
if (pos >= 0)
substr = str.Substring(pos + "DETAIL:".Length);
else
// Handle missing "DETAIL:"
编辑:如果您绝对想要使用LINQ,可以将字符串视为字符序列并使用以下(低效)代码:
string keyword = "DETAIL:";
int length = keyword.Length;
char[] chars = str.Select((c, i) => str.Skip(i))
.First(s => s.Take(length).SequenceEqual(keyword))
.Skip(length)
.ToArray();
string substr = new string(chars);
答案 1 :(得分:1)
为此,我更喜欢道格拉斯的回答。为了完整起见,这也非常适合Regex:
var s = "USERNAME: ADMIN|00004|GI FILE: Lorem ipsum dolor sit amet1.docx DETAIL:There was no endpoint listening at http://localhost:5557/";
var pattern = @"(?<=DETAIL:).*";
var matches = System.Text.RegularExpressions.Regex.Matches(s, pattern);
foreach(var match in matches)
{
Console.WriteLine(match);
}
// output: There was no endpoint listening at http://localhost:5557/
正则表达式解释:
(?<=DETAIL:)
(?<=[regex])
是一个积极的外观,这意味着它看起来正则表达式的下一部分在它后面的<=
之后有正则表达式DETAIL:
只匹配那个确切的字符串.*
表示“0或更多任何字符”
.
表示“任何角色”*
表示前一项中的0个或更多如果确实想在那里抛出一些LINQ,你可以尝试使用带有一些临时变量的多行lambda:
var temp = "";
var target = "DETAIL:";
var detail = String.Join("", s.SkipWhile(c => {
if (temp == target) return false;
temp = target.Contains(c) ? temp + c : "";
return true;
}));
Console.WriteLine(detail); // output: There was no endpoint listening at http://localhost:5557/
由于string
在技术上是IEnumerable<char>
,因此您可以对它们执行LINQ操作。问题是,由于LINQ会返回IEnumerable<char>
,因此您需要使用String.Join
或new String(char[])
这样的内容将它们恢复为可读格式。这里也使用临时变量,因为LINQ操作会单独处理所有字符,因此没有真正的方法可以告诉我们在字符串中的位置,否则在执行期间。
答案 2 :(得分:0)
我的简单解决方案:
var str1 = "USERNAME: ADMIN|00004|GI FILE: Lorem ipsum dolor sit amet1.docx DETAIL:There was no endpoint listening at http://localhost:5557/";
var keyword = "DETAIL:";
var str = str1.Split(new string[]{keyword}, StringSplitOptions.None)[1];
答案 3 :(得分:0)
所有其他答案都是更好的方法,但是如果你真的想在LINQ中做这件事,那么就会出现以下几点:
string s = "USERNAME: ADMIN|00004|GI FILE: Lorem ipsum dolor sit amet1.docx DETAIL:There was no endpoint listening at http://localhost:5557/";
string r = string.Join(" ", s.Split(' ', ':').SkipWhile(x => x != "DETAIL").Skip(1));
Console.Write(r);
应该给你“没有端点监听http // localhost 5557 /”
注意缺少“:”,因为我需要在Split()中删除它们。它并不完美,但应该指向正确的方向。
答案 4 :(得分:0)
OP目标=&gt; Because I'm learning linq at this moment
LINQ基于extension method
来定义标准查询运算符,这些运算符将查询功能添加到现有。
你可以定义类似这样的东西
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
string s =
@"USERNAME: ADMIN|00004|GI FILE: Lorem ipsum dolor sit amet1.docx DETAIL:There was no endpoint listening at http://localhost:5557/";
var str = s.SkipUntilWord("DETAIL:");
}
}
public static class MyExtensions
{
public static string SkipUntilWord(this String str,string word)
{
return str.Substring(str.IndexOf(word,StringComparison.CurrentCulture) + word.Length);
}
}