2012-03-10 3 views
2

Я использую следующее выражение.Регулярное выражение Не работает в .net

\ W [A-C] {3}

Цель состоит в том, чтобы соответствовать 3-х символов чего-либо между А и С, которые не имеют каких-либо символов перед ними. Так что с вводом «ABC» он совпадает, но «DABC» этого не делает.

Когда я пытаюсь использовать это выражение, используя различные инструменты онлайн-регулярных выражений (например, http://gskinner.com/RegExr/), он отлично работает. Когда я пытаюсь использовать его в asp.net RegularExpressionValidator или с классом RegEx, он никогда не соответствует чему-либо.

Я пробовал различные методы, не позволяющие персонажу перед матчем. например.

[^\w] and [^a-zA-Z0-9] 

все работает в онлайн-инструментах, но не в .net.

Этот тест не удается, но я не уверен, почему?

[Test] 
public void RegExWorks() 
{ 
    var regex = new Regex("\\W[A-C]{3}"); 
    Match match = regex.Match("ABC"); 
    Assert.IsTrue(match.Success); 
} 

ответ

3

Как о чем-то вроде этого:

^[A-C]{3} 

Это просто, но, кажется, подходит то, что вы просите, и я испытал его в rubular.com и.NET

+0

Да, ваше право, это действительно работает. Но, как ни странно, это не работает, когда я пытаюсь это сделать на http://gskinner.com/RegExr/ - я не уверен, какой из 3 ответов является лучшим? Все они работают – Robbie

+0

Это довольно стандартный рег, поэтому я не уверен, почему он там не работает. Если вы перейдете на сайт reg ex, то есть ... –

3

Проблема заключается в том, что вы требуют там быть \W характер. Используйте исправление, чтобы исправить это, или lookbehind, чтобы убедиться, что нет недопустимых символов.

Переделка:

(?:\W|^)[A-C]{3} 

Но я предпочел бы отрицательно: 'назад

(?<!\w)[A-C]{3} 

\b (как в gymbralls ответ) является аббревиатурой (?<!\w)(?=\w)|(?<=\w)(?!\w), что в этом случае просто будет означать (?<!\w), эквивалентно.

Кроме того, в C# можно использовать @ процитировать, так что вы не должны дважды избежать вещи, например:

var regex = new Regex(@"(?<!\w)[A-C]{3}"); 
+0

Благодаря человеку! это исправлено. – Robbie

2

Вы должны рассмотреть попытку:

[Test] 
public void RegExWorks() 
{ 
    var regex = new Regex("\\b[A-C]{3}"); 
    Match match = regex.Match("ABC"); 
    Assert.IsTrue(match.Success); 
} 

\\b соответствует граница слова, что означает, что он будет соответствовать «ABC», а также «ABC» и «$ ABC». Использование \\W требует наличия символа без слова, который не похож на то, что вы хотите.

Сообщите мне, если я что-то упустил.

+0

+1. Почему я всегда забываю о '\ b' ;-) – Qtax

+0

Извините, я не был ясен в вопросе, я хотел убедиться, что никаких символов не было до матча. Я понял, что мне нужно то, что мне нужно. Я думаю, что отрицательный lookbehind в первом ответе дает мне то, что мне нужно. Я бы не хотел, чтобы он соответствовал «$ ABC». – Robbie

+0

@ Robbie, lookbehind в моем ответе * будет * соответствовать этому. Вы просто хотите '^ [A-C] {3} $'? Какие символы разрешены до 'ABC'? Если вы хотите только разрешить пробел, вы можете использовать '(? Qtax

-1

Это просто как "[A-C] {3}" это

+0

, который не обеспечил бы совпадения в начале ввода, который мне нужен. – Robbie

-1

ОК, так что вы можете попробовать следующее выражение

"[A-C] [A-C] {2}"

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