Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#正则表达式_C#_Regex - Fatal编程技术网

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) == ""