C#:解析字符串并查找某个单词

10

我有一些字符串

   bla bla bla bla  <I NEED THIS TEXT> 

如何以最佳和最快的方式获取<>内部的文本?


1
IndexOf解决方案的问题在于文本中的“bla bla > bla bla <I NEED THIS TEXT>”文本。在这种情况下,结束位置小于起始位置。 - Aaaaaaaa
3
正确处理时不会出现这种情况——这里的大多数示例都提供了实现目标的粗略想法,而不是涵盖每个可能的方面;可以假设OP会根据需要调整答案。 - Grant Thomas
1
有很多可能的方面,这就是为什么有正则表达式的原因。 - Aaaaaaaa
1
@Csillik David Janos:正则表达式不是用来滥用的。对于简单任务,没有必要使用如此昂贵的机制——你曾经用过大锤砸核桃吗?我并不否认它们的作用,但它们不应该随意使用。 - Grant Thomas
9个回答

6
int start = s.IndexOf("<") + 1;
int end = s.IndexOf(">",start);

string text = s.Substring(start,end - start);

3
var s = "bla bla bla bla  <I NEED THIS TEXT> ";
Console.WriteLine(s.Substring(s.IndexOf('<') + 1, s.IndexOf('>') - s.IndexOf('<') - 1));

3

3
Regex.Match(input, "<(.*)>").Groups[1].Value

2
var input = "bla bla bla bla  <I NEED THIS TEXT> ";

var match = Regex.Match(input, @".*?<(?<MyGroup>.*?)>");
if (match.Success)
    var text = match.Groups["MyGroup"].Value;

这个用正则表达式的答案是第一个,我已经检查过了,它能正常工作。 - Ievgen
1
@Evgeny - 感谢您的认可。实际上,在确认我的答案有效之前,我并没有发布它。有时候很遗憾发现有些人只是匿名地点踩而不给出任何解释。此外,我注意到每当有关解析的问题被提出时,人们倾向于赞同非正则表达式的答案。 - Alex Aza
1
@Csillik David Janos - 如果您认为这是错误的,请在评论之前检查代码是否有效。 - Alex Aza
首先,这是一个问题。但你是正确的,它运行良好! - Aaaaaaaa

2

是否会嵌套?上面两个答案将会给出不同的结果:

static void Main()
{
    string s = "hello<I NEED <I NEED THIS TEXT> THIS TEXT>goodbye";

    string r = Regex.Match(s, "<(.*)>").Groups[1].Value;

    int start = s.IndexOf("<") + 1;
    int end = s.IndexOf(">", start);
    string t = s.Substring(start, end - start);

    Console.WriteLine(r);
    Console.WriteLine(t);

    Console.ReadKey();
}

1

不使用正则表达式和任何排序检查:

var data = "bla bla bla bla <I NEED THIS TEXT>";

int start = 0, end = 0;
if ((start = data .IndexOf("<")) > 0 &&
    (end = data .IndexOf(">", start)) > 0)
{
    var result = data .Substring(start + 1, end - start - 1);
}

1
使用string.SubString和IndexOf方法只有在“<”和“>”是您想要的文本的开头和结尾时才有效。如果这些字符恰好在实际文本开始之前包含,则无法获得正确的字符串。
最好的方法是使用正则表达式。

0
var input = "bla bla bla bla  <I NEED THIS TEXT>";
Match match = Regex.Match(input, @"<([^>]*)>");
if (match.Success)
{
    // Do some with match.Groups[1].Value;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接