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));
});
}
}