2010-12-13 2 views
1

Я хочу проверить имя, используя регулярное выражение, но я не получаю убедительного результата. Может ли кто-нибудь подумать о том, что я неправильно делаю в своем шаблоне регулярных выражений?Регулярное замешательство выражения

foreach(Match m in 
(Regex.Matches("Jack_Sparrow","^[A-za-z]+[^-]*(\\d)*$"))) 
    { 
     Console.WriteLine("{0} found at index{1}",m.Value,m.Index); 
    } 

Могу ли я узнать, почему я получаю Jack_Sparrow в качестве выходного сигнала, несмотря на не проверять подчеркивание (_) в шуме? Я скорее хочу Jack Sparrow в качестве выхода. Какая модификация мне нужна?

+1

звучит так, как вам нужно *, чтобы сделать 'str_replace (" _ "," ", $ username)'. Но если вы не будете описывать свою проблему немного лучше или дать еще несколько примеров, никто не сможет это понять. – mpen

ответ

1

Первая половина диапазона вашего персонажа, включая его

[A-za-z] создает диапазон от верхнего регистра А в нижнем регистре г, то другой диапазон от нижнего случая а к нижнему регистру 2. Эти диапазоны перекрываются во второй части из-за того, как работают значения ASCII. В частности, A-z создает диапазон от символа ASCII 65 (A) до символа 12 2 (z). Символ подчеркивания имеет значение 95, которое находится между ними. Поскольку ваше регулярное выражение привязано, этот класс символов is where the match is occurring. Я изменил ваш класс символов, включив в этот пример круглые скобки, чтобы вы могли видеть, что он захватывает весь текст «Jack_Sparrow».

Вы должны уметь решать это конкретное совпадение, изменяя диапазон символов, равный [A-Za-z]. Тем не менее, он все равно будет соответствовать первой части («Джек»), а затем часть [^-]* будет соответствовать оставшейся части строки («_Sparrow»), все еще вызывая ее действительное совпадение. Если вы можете предоставить некоторые другие текстовые примеры, мы можем помочь вам улучшить это дальше. Имея текущую информацию, вы можете сказать, как лучше всего исправить проблему [^-].

+0

Чарльз по-прежнему прав, даже если он исправляет это, он будет продолжать соответствовать из-за '[^ -]'. – mpen

+0

@ Ralph: Да, только что отметил это. Я должен был упомянуть об этом ранее. – eldarerathis

+0

Err .. нет действительно. Он заканчивает свое регулярное выражение '$'. Он должен соответствовать концу строки, или он не будет соответствовать вообще. Это будет * не * соответствовать только «Джек». – mpen

1

[^-] проверяет любой символ, кроме -, поэтому это соответствует знаку подчеркивания. Я не совсем уверен, что вы хотите здесь.

Вы пытаетесь изменить все, кроме букв, на пробелы, возможно?

+0

Если я опускаю [^ -], а затем получаю «Jack_Sparrow» в качестве вывода. Могу я узнать почему? – Justin

0

Еогеасп (матч м (Regex.Matches ("Jack_Sparrow", "[^ A-Za-Z]")) { Console.WriteLine ("{0} по индексу {1}", m.Value, m.Index);. }

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