2016-01-07 6 views
1

Я хочу заменить все экземпляры всех последовательных букв нижнего регистра-алфавита единым пространством для каждого экземпляра. Это работает, но почему он вводит пробелы между буквами алфавита?Почему это регулярное выражение ничего не соответствует?

const string pattern = @"[^a-z]*"; 
const string replacement = @" "; 
var reg = new Regex(pattern); 

string a = "the --fat- cat"; 
string b = reg.Replace(a, replacement); // b = " t h e f a t c a t " should be "the fat cat" 
+0

Используйте '+', '@" [^ a-z] + "' – Tushar

ответ

3

Из-за * (который повторяет предыдущие маркер нулевой или более раз). Он должен найти совпадение во всех границах, поскольку на всех этих границах существует пустая строка.

const string pattern = @"[^a-z]+"; 
+1

Ну, не только :) 'Regex.Replace' также« виноват ». На самом деле, шаблон OP соответствует слишком много, и этот метод находит и заменяет все из них. –

0

Вам не нужно регулярное выражение, если вы просто хотите, чтобы удалить не-строчные буквы:

string a = "the --fat- cat"; 
string res = String.Join("", a.Where(c => Char.IsLower(c) || Char.IsWhiteSpace(c))); 

Console.WriteLine(res); // the fat cat 
+0

Да, но это не приведет к сокращению количества символов пробела. Регулярное выражение еще лучше для этой задачи. –

0

Просто следить за ответ, который может оказаться полезным: если вам нужно, чтобы соответствовать любому символу, но любой Unicode строчной буквы, вы можете использовать

var res = Regex.Replace(str, @"\P{Ll}+", " "); 
// "моя НЕ знает" > "моя знает" 

\P{Ll} конструкция будет соответствовать всем символам, но прописные буквы от все таблицы Unicode. Коэффициент + будет соответствовать одному или нескольким событиям и не вызовет проблему в ОП.

И illustration of the current problem вызванное [^a-z]* (см вертикальные трубы, показывающие, где Regex.Replace найдена пустая строка соответствует):

enter image description here

Эмпирическое правило: избежать unanchored шаблонов, которые могут соответствовать пустые строки !

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