说我有以下文字:
Start
A
B
C
End
Start
A
B
C
End Start
A
B
C
End
Foo
A
B
C
Bar
我想用管道替换换行符,但只在“开始”和“结束”字之间,以便我的最终结果是:
Start|A|B|C|End
Start|A|B|C|End Start|A|B|C|End
Foo
A
B
C
Bar
非常感谢。
答案 0 :(得分:5)
当你开始解析那样的表达式时,你就不再处于正则表达式领域了。与XML类似,您需要根据其上下文区别对待相同字符的表达式是一类高于正则表达式的语言。
在这种情况下,更直接地通过字符串戳的更传统的方法会更好。
假设原始字符串按照示例显示的空格分割,您可以在任何空格上拆分字符串,并在Start
和End
令牌之间设置标记标记之间的管道而不是换行符。
答案 1 :(得分:1)
正则表达式:
(Start)[\n]*(A)[\n]*(B)[\n]*(C)[\n]*(End)
替换为:
$1|$2|$3|$4|$5
你可以为Start,End,A,B和C输入你自己的值甚至正则表达式。如果你告诉我你在使用什么,取决于你的语言/正则表达式引擎,替换为part可能会有所不同我可以更具体。
答案 2 :(得分:1)
这适用于您提供的案例。不能保证它适用于任何更复杂的事情。
class Program
{
static void Main(string[] args)
{
string s = "Start" + Environment.NewLine +
"A" + Environment.NewLine +
"B" + Environment.NewLine +
"C" + Environment.NewLine +
"End" + Environment.NewLine +
"Start" + Environment.NewLine +
"A" + Environment.NewLine +
"B" + Environment.NewLine +
"C" + Environment.NewLine +
"End Start" + Environment.NewLine +
"A" + Environment.NewLine +
"B" + Environment.NewLine +
"C" + Environment.NewLine +
"End" + Environment.NewLine +
"Foo" + Environment.NewLine +
"A" + Environment.NewLine +
"B" + Environment.NewLine +
"C" + Environment.NewLine +
"Bar";
Regex regex = new Regex(@"Start(\r\n[^\r\n(End)]*)*End", RegexOptions.Multiline);
string replaced = regex.Replace(s, AddPipes);
Console.WriteLine(replaced);
Console.ReadLine();
}
static string AddPipes(Match m)
{
string x = m.ToString();
return x.Replace("\r\n", "|");
}
}
答案 3 :(得分:0)
我同意Welbog,我认为在这种情况下你可能会要求太多正则表达式。我建议采用2通方法。根据{{3}},以下内容将与您的仲裁长度
的目标段落相匹配(Start)(\r\n)((.*)\2)+?(End)
我会使用上面的正则表达式来提取文本中的匹配段落,然后使用简单的正则表达式或字符串替换函数将Cr Lf字符交换为管道。