C#正则表达式
我需要一个正则表达式从基于索引的文本输入中获取单词。这个词应该放在方括号内 我将试着举例说明。 如果我的输入是C#正则表达式,c#,regex,C#,Regex,我需要一个正则表达式从基于索引的文本输入中获取单词。这个词应该放在方括号内 我将试着举例说明。 如果我的输入是hh{jhh}jkhjh{jkjhh{kljk}j}adajskjj}。对于任何字符索引,如果它位于一对括号之间,我必须获取该单词,包括括号。 在上面的输入中,如果索引是2或4,则输出应该是{jhh}不确定您要的是什么,regexp是regexp,您不能告诉它从索引i开始查找,也不能向后移动搜索 您正在查找的Regexp可能如下所示: (\{.*\}) 如果您正在寻找一种方法来获取开始
hh{jhh}jkhjh{jkjhh{kljk}j}adajskjj}
。对于任何字符索引,如果它位于一对括号之间,我必须获取该单词,包括括号。
在上面的输入中,如果索引是2或4,则输出应该是
{jhh}
不确定您要的是什么,regexp是regexp,您不能告诉它从索引i开始查找,也不能向后移动搜索
您正在查找的Regexp可能如下所示:
(\{.*\})
如果您正在寻找一种方法来获取开始>索引
请编写您自己的标记器。试试这个。当然,有很多问题。首先,您没有说明如何处理嵌套括号。如果您需要处理嵌套括号,那么使用简单的正则表达式就不太好了,因为您需要一个上下文无关的语法。还要注意,以下实现是naiv因为它在单词查找上具有线性时间复杂性(查找单词的时间与找到的匹配数成正比)。但是,这只会是大量匹配的问题。更好的实现可以使用,例如,匹配的排序数组和查找的二进制搜索
using System.Text.RegularExpressions;
namespace WindowsFormsApplication1
{
public class ParsedInput
{
public static readonly Regex RegularExpression = new Regex("{[a-z]*}");
private MatchCollection matches;
public ParsedInput(string input)
{
matches = RegularExpression.Matches(input);
}
public bool TryGetWord(int index, out string word)
{
foreach (Match match in matches)
{
if (index >= match.Index && index < (match.Index + match.Length))
{
word = match.Captures[0].Value;
return true;
}
}
word = "";
return false;
}
}
}
您的规格非常简单,但像这样的东西可能会比 正则表达式
如果索引为14,会发生什么情况?括号似乎没有正确打开和关闭,这是故意的吗?如果索引为14,因为没有关联的闭合括号不存在,它将不返回任何内容。括号是故意的
var parsed = new ParsedInput(input);
string word = "";
if (parsed.TryGetWord(index, out word))
{
// A word exists at the given index, do something.
}
else
{
// Handle missing word at the given index (optional).
}
string GetWord(string value, int index)
{
if (index < 0 || index >= value.Length)
{
return String.Empty;
}
int start = (value[index] == '}') ? index-1 : index;
int end = (value[index] == '}') ? index : index+1;
int count = 1;
for (; start >= 0 && count > 0; start--)
{
count += (value[start] == '}') ? 1 : 0;
count -= (value[start] == '{') ? 1 : 0;
}
for (count = 1; end < value.Length && count > 0; end++)
{
count += (value[end] == '{') ? 1 : 0;
count -= (value[end] == '}') ? 1 : 0;
}
return value.Substring(++start, end - start);
}
GetWord(input,2) == "{jhh}"
GetWord(input,8) == "hh{jhh}jkhjh{jkjhh{kljk}j}adajskjj}"
GetWord(input,14) == "{jkjhh{kljk}j}"
GetWord(input,30) == "hh{jhh}jkhjh{jkjhh{kljk}j}adajskjj}"
GetWord(input,99) == ""