在正则表达式与c#匹配之前插入换行符

时间:2016-07-03 07:13:15

标签: c# regex

我有一个包含以下文字的文件:

adj 1: text1 2: text2 n 1: text4 adj 1: text5 adv 1: text6 3: text7

我想在adj,n,数字等之间插入换行符(n)以获得以下输出:

adj 1: text1 
2: text2 
n 1: text4 
adj 1: text5 
adv 1: text6 
3: text7

我有这个正则表达式:\s+\d+|\s+((n|v|adv|adj|)\s+\d+)

现在,如果我使用Regex.Replace(),则添加换行符,但也会删除找到的匹配项(1,2,n 1等)。有没有什么方法可以在比赛前插入换行而不删除比赛?

2 个答案:

答案 0 :(得分:1)

使用捕获组。

表示通用前缀,不限于(n|v|adv|adj)

搜索((\w*?\s)?\d+: [\w]*?($|\s))

限制为(n|v|adv|adj)

的前缀

搜索(((n|v|adv|adj)\s)?\d+: [\w]*?($|\s))

替换为$1\n

https://regex101.com/r/vJ1lY1/3

https://msdn.microsoft.com/en-us/library/ewy2t5e0(v=vs.110).aspx

答案 1 :(得分:1)

由于我的评论几乎是正确的,我决定改进它并转化为答案。重点是你有一组关键字,你可以放入一个交替组,因为你知道它们后跟一个空格和后面跟冒号的数字,你可以将这个块定义为一个单独的字符串。然后,您可以匹配任意数量的任何字符,直到同一个块的第一次出现。

这是sample demo

var s = "adj 1: text1 2: text2 n 1: text4 adj 1: text5 adv 1: text6 3: text7";
var block = @"(?:[nv]|ad[vj])?\s*\d+:";
var pat = string.Format(@"{0}.*?\s*(?={0})", block);
var result = Regex.Replace(s, pat, "$&\n");
// => adj 1: text1 
//2: text2 
//n 1: text4 
//adj 1: text5 
//adv 1: text6 
//3: text7

模式详情

  • (?:[nv]|ad[vj])?\s*\d+: - 匹配nvadjadv的1或0次匹配,然后是0 +空格和1+位数后跟冒号
  • .*?\s* - 0+任何字符,但是新行直到第0个以上的空格......
  • (?=(?:[nv]|ad[vj])?\s*\d+:) - ......后跟上述块。

请参阅regex demo