Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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,我需要解析如下字符串: var outside = string.Join("", Regex.Split(inputString, "<%.*?%>")); text0text1text3 分成两个数组。每个块都是可选的,因此它可以是文本或或空字符串。 取出代码很容易(如果我没弄错的话):,但我需要文本方面的帮助,因为它不像代码那样有这样的标记 谢谢 由于正则表达式匹配必须是连续的(即没有间隙),因此没有单个表达式匹配标记之外的所有文本。但是,如果将正则表达式与C#的string

我需要解析如下字符串:

var outside = string.Join("", Regex.Split(inputString, "<%.*?%>"));
text0text1text3

分成两个数组。每个块都是可选的,因此它可以是
文本
或空字符串。 取出代码很容易(如果我没弄错的话):
,但我需要文本方面的帮助,因为它不像代码那样有这样的标记


谢谢

由于正则表达式匹配必须是连续的(即没有间隙),因此没有单个表达式匹配标记之外的所有文本。但是,如果将正则表达式与C#的
string
功能结合起来,您仍然可以这样做,如下所示:

var outside = string.Join("", Regex.Split(inputString, "<%.*?%>"));
var-outside=string.Join(“,Regex.Split(inputString)”);
如果标记内部可能不包含百分比字符,则可以使用以下表达式优化正则表达式以避免:

<%[^%]*%>

这个非常简单的正则表达式可以:-):-) (这很讽刺……正则表达式是正确的,但它绝对不可读,即使是正则表达式专家也可能至少需要10分钟才能完全理解它)

捕获组1:

(?<1> ... ) The name of the group (1)

现在,每个捕获都有一个
索引
,一个
文本
,对于
文本
可以是
,对于
转义
可以是
,还有一个
,即
捕获
的文本,您可以使用Regex。替换

var text = Regex.Replace(input, "<%.+?%>", "");
var text=Regex.Replace(输入“,”);
试试这个:

class Program
{
    static void Main(string[] args)
    {
        var input = "text0<%code0%>text1<%code1%><%%>text3";
        List<string>
            text = new List<string>(),
            code = new List<string>();
        var current = 0;
        Regex.Matches(input, @"<%.*?%>")
            .Cast<Match>()
            .ToList().ForEach(m =>
            {
                text.Add(input.Substring(current, m.Index - current));
                code.Add(m.Value);
                current = m.Index + m.Length;
                if(!m.NextMatch().Success)
                    text.Add(input.Substring(current, input.Length - current));
            });
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var input=“text0text1text3”;
列表
text=新列表(),
代码=新列表();
无功电流=0;
Regex.Matches(输入@“”)
.Cast()
.ToList().ForEach(m=>
{
Add(input.Substring(current,m.Index-current));
代码。添加(m.值);
电流=米指数+米长度;
如果(!m.NextMatch().Success)
Add(input.Substring(current,input.Length-current));
});
}
}

若要获取文本数组,您可以通过
进行拆分。我不是
C
dev,因此无法为您提供正确的代码:)或者
)*%>
(?<2> ... ) The name of the group (2)
((?!%>).)* Any character that isn't a < followed by a % (can be empty)
var rx = new Regex("((?<1>((?!<%).)+)|<%(?<2>((?!<%|%>).)*)%>|(?<3><%.*))*", RegexOptions.ExplicitCapture);
string[] errors = res2.Groups[3].Captures.Cast<Capture>().Select(p => p.Value).ToArray();
var captures = res2.Groups[1].Captures.Cast<Capture>().Select(p => new { Text = true, Index = p.Index, p.Value })
    .Concat(res2.Groups[2].Captures.Cast<Capture>().Select(p => new { Text = false, Index = p.Index, p.Value }))
    .OrderBy(p => p.Index)
    .ToArray();
var text = Regex.Replace(input, "<%.+?%>", "");
class Program
{
    static void Main(string[] args)
    {
        var input = "text0<%code0%>text1<%code1%><%%>text3";
        List<string>
            text = new List<string>(),
            code = new List<string>();
        var current = 0;
        Regex.Matches(input, @"<%.*?%>")
            .Cast<Match>()
            .ToList().ForEach(m =>
            {
                text.Add(input.Substring(current, m.Index - current));
                code.Add(m.Value);
                current = m.Index + m.Length;
                if(!m.NextMatch().Success)
                    text.Add(input.Substring(current, input.Length - current));
            });
    }
}