我有一个包含以下文字的文件:
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等)。有没有什么方法可以在比赛前插入换行而不删除比赛?
答案 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+:
- 匹配n
,v
,adj
,adv
的1或0次匹配,然后是0 +空格和1+位数后跟冒号.*?\s*
- 0+任何字符,但是新行直到第0个以上的空格...... (?=(?:[nv]|ad[vj])?\s*\d+:)
- ......后跟上述块。请参阅regex demo