2016-07-03 2 views
0

У меня есть файл, который содержит тексты, как показано ниже:Вставка новой строки перед регулярным выражением матча с C#

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

Я хочу, чтобы вставить символ новой строки (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() это добавить символ новой строки, но и удалит найденное циновку ches (1, 2, n 1 и т. д.). Есть ли способ, чтобы я мог вставить новую строку перед матчем, не удаляя совпадение?

+1

Вам потребуется lookarounds - нулевой ширины утверждения. Если вы предоставляете более реалистичную строку ввода, наверняка люди готовы помочь вам. – Jan

+1

[Что-то близкое к тому, что вам нужно] (http://regexstorm.net/tester?p= (% 3f% 3a% 5bnv% 5d% 7cad% 5bvj% 5d)% 3f% 5cs% 2b% 5cd% 2b% 3a . *% 3f (% 3f% 3d% 24% 7c (% 3f% 3a% 5bnv% 5d% 7cad% 5bvj% 5d)% 3f% 5cs% 2b% 5CD% 2b% 3a) & я = прил + 1% 3a + текст1 + 2% 3a + текст2 + п + 1% 3a + text4 + прил + 1% 3a + text5 + Adv + 1% 3a + text6 + 3% 3a + text7 & г =% 24% 26% 0D% 0A). –

ответ

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+: - соответствует 1 или 0 вхождений n, v, adj, adv, затем 0+ и 1+ непечатаемых цифры с двоеточием.
  • .*?\s* - 0+ любые символы новой строки, но до первых 0+, что ... непечатаемых
  • (?=(?:[nv]|ad[vj])?\s*\d+:) - ... которые следуют с блоком, описанным выше.

См regex demo

+0

Обратите внимание, что в.NET, вы никогда не должны включать полный шаблон в группу захвата (как и в другом ответе), так как «$ &» обратные ссылки на весь матч. –

Смежные вопросы