2015-01-29 2 views
1

У меня есть следующий код, чтобы найти и заменить слова, которые больше, чем один символ, содержащий дефис и не содержат цифры:Удалить переносы с использованием регулярных выражений

new Regex(@"\w{2,}\-\D", RegexOptions.IgnoreCase).Replace(s, " ") 

Что мне нужно изменить для того, чтобы заменить только дефисов в совпадающих словах?

+0

Что вы пробовали? Используйте Regex.Replace, чтобы найти и убрать соответствующие слова и заменить их по своему усмотрению. Это не должно быть сложно, если вы знаете регулярные выражения. – AFract

+0

Я новичок в регулярном выражении. Какое выражение мне нужно? – Matansh

+0

Я написал ответ ниже. – AFract

ответ

0

Если я правильно понял ваш вопрос - вы хотите заменить пробелом не всю группу «длиннее одного символа, содержащего дефис и не содержать цифр» - но только дефис, содержащийся в этих группах.

Для этого вам не нужно менять выражение регулярного выражения, так как оно выполняет свою работу и находит эти группы.

Все, что вам нужно - это еще одно переопределение метода Regex.Replace, который принимает строку замены, но MatchEvaluator делегат. Этот делегат вызывается в каждом матче, и из этого делегата вы должны возвращать либо исходную строку, либо строку замены, в которой вы нуждаетесь.

Так что ваш код может выглядеть следующим образом:

new Regex(@"\w{2,}\-\D", RegexOptions.IgnoreCase) 
    .Replace(s, m => m.Groups[0].Value.Replace("-", " ")); 
0

Если я хорошо понял, это должно помочь:

string input = "12-12 - a-b test-test test3 abc-xyz - plop"; 
string regex = @"[a-zA-Z]{2,}\-[a-zA-Z]{2,} "; 
string replace = ""; 

Console.WriteLine(Regex.Replace(input, regex, replace)); 

Он заменяет все слова, которые имеют более 1 буквенный символ слева и справа от дефис ничем. Если есть число слева или справа от дефиса, замена отсутствует. То же самое, если вокруг дефиса есть пробел. Он также удаляет дополнительное пространство.

В строке примера выше «test-test» и «abc-xyz» удаляются.

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