【发布时间】:2015-02-21 04:56:32
【问题描述】:
在 C# 中,我有一个字符串进入,我正在读入一个看起来像这样的变量
var fullString = "Some random text (importantword)"
解析“重要词”的最简单方法是什么?正则表达式?只为“(”和“)”字符做 .IndexOf()?
【问题讨论】:
在 C# 中,我有一个字符串进入,我正在读入一个看起来像这样的变量
var fullString = "Some random text (importantword)"
解析“重要词”的最简单方法是什么?正则表达式?只为“(”和“)”字符做 .IndexOf()?
【问题讨论】:
IndexOf 绝对是最简单的。
https://msdn.microsoft.com/en-us/library/aa287734%28v=vs.71%29.aspx
后跟一个子字符串。
var startIndex = fullString.IndexOf("(") + 1;
var endIndex = fullString.IndexOf(")");
var targetWord = fullString.Substring(startIndex, endIndex - startIndex);
编辑:正如下面的 cmets 所指出的,我忘记了 startIndex 是用于左括号而不是实际单词。
【讨论】:
正则表达式有两个缺点:它们可能比IndexOf() 慢,而且它们通常不容易阅读和理解。在您的情况下,查找括号中的文本很容易,不需要正则表达式。
如果您的字符串总是以) 结尾,那么您可以只搜索( 并删除最后一个字符:
var start = fullString.IndexOf('(') + 1;
var end = fullString.Length - 1;
return fullString.Substring(start, end - start);
否则,进行两次搜索。在最后一种情况下,请记住使用 IndexOf(char, int) 重载以避免搜索整个字符串:
var start = fullString.IndexOf('(') + 1;
var end = fullString.IndexOf(')', start); // Notice the `start`
return fullString.Substring(start, end - start);
【讨论】:
@"(?<=\()[^()]*(?=\))"。由于经验丰富,您可能对正则表达式感到满意,但我敢肯定,许多普通程序员将无法轻松阅读类似的表达式或在瞥一眼后发现其中的错误。
您可以使用捕获组或环视来获取 () 括号之间的所有字符。
String input = @"Some random text (importantword)";
Regex rgx = new Regex(@"(?<=\()[^()]*(?=\))");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Groups[0].Value);
或
String input = @"Some random text (importantword)";
Regex rgx = new Regex(@"\(([^()]*)\)");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Groups[1].Value);
【讨论】: