Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,嘿,我有一个如下的输入字符串: Just a test Post [c] hello world [/c] 输出应为: 你好,世界 有人能帮忙吗 我尝试使用: Regex regex = new Regex("[c](.*)[/c]"); var v = regex.Match(post.Content); string s = v.Groups[1].ToString(); 将代码更改为: Regex regex = new Regex(@"\[c\](.*)\[/c\]"); var

嘿,我有一个如下的输入字符串:

Just a test Post [c] hello world [/c] 
输出应为:

你好,世界

有人能帮忙吗

我尝试使用:

Regex regex = new Regex("[c](.*)[/c]");
var v = regex.Match(post.Content);
string s = v.Groups[1].ToString();
将代码更改为:

Regex regex = new Regex(@"\[c\](.*)\[/c\]");
var v = regex.Match(post.Content);
string s = v.Groups[1].Value;

你在找这样的东西吗

var regex = new Regex(@"(?<=\[c\]).*?(?=\[/c\])");
foreach(Match match in regex.Matches(someString))
    Console.WriteLine(match.Value);

<代码> var ReGeX =新正则表达式(@)(?< p>您可以不使用代码> ReXEX < /代码>。考虑此扩展方法:

public static string GetStrBetweenTags(this string value, 
                                       string startTag, 
                                       string endTag)
{
    if (value.Contains(startTag) && value.Contains(endTag))
    {
        int index = value.IndexOf(startTag) + startTag.Length;
        return value.Substring(index, value.IndexOf(endTag) - index);
    }
    else
        return null;
}
并使用它:

string s = "Just a test Post [c] hello world [/c] ";
string res = s.GetStrBetweenTags("[c]", "[/c]");
正则表达式

[character_group]
指:

匹配
字符组
中的任何单个字符

请注意,
\、*、+、?、|、{、[、(,)、^、$、、、、、、、、、、、、、、、、
空白
都是,您必须使用
\
才能在表达式中使用它们:

\[c\](.*)\[/c\]
正则表达式中的反斜杠字符
\
表示它后面的字符是特殊字符,或者应该按字面解释

因此,如果您编辑正则表达式,您的代码应能正常工作:

Regex regex = new Regex("\[c\](.*)\[/c\]");
var v = regex.Match(post.Content);
string s = v.Groups[1].ToString();

借助@horgh的答案,这增加了一个包容性/排他性选项:

public static string ExtractBetween(this string str, string startTag, string endTag, bool inclusive)
{
    string rtn = null;

    int s = str.IndexOf(startTag);
    if (s >= 0)
    {
        if(!inclusive)
            s += startTag.Length;

        int e = str.IndexOf(endTag, s);
        if (e > s)
        {
            if (inclusive)
                e += startTag.Length;

            rtn = str.Substring(s, e - s);
        }
    }

    return rtn;
}

此代码还考虑相同的开头标记,可以忽略标记大小写

 public static string GetTextBetween(this string value, string startTag, string endTag, StringComparison stringComparison = StringComparison.CurrentCulture)
    {
        if (!string.IsNullOrEmpty(value))
        {
            int startIndex = value.IndexOf(startTag, stringComparison) + startTag.Length;
            if (startIndex > -0)
            {
                var endIndex = value.IndexOf(endTag, startIndex, stringComparison);
                if (endIndex > 0)
                {
                    return value.Substring(startIndex, endIndex - startIndex);
                }
            }
        }
        return null;
    }

我试着使用正则表达式,但没用。你可以在线测试你的正则表达式。下面是我的改进版本