2016-01-11 4 views
2

Работы в C# .Net 4.5C# - Отрицательный Lookahead не похож на работу

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

То, что я думаю, должна быть правильная картина такова:

(?![A-Z]{2,})\w 

Примечание: пытался как ?! и ?<!

я наоборот работать, искать строку и возвращает истину, если есть 2 или более колпачка подряд и что картина выглядит следующим образом:

(?=[A-Z]{2,})\w 

Но я должен иметь это отработкой отрицательного предпросмотра шаблон.

Из всех сообщений, которые я прочитал, это должен быть правильный способ сделать это, но он не работает для меня.

Я прочитал такие вопросы, как:

C# regexp negative lookahead или Regex negative lookahead in c#

и т.д ...

Я не хочу, чтобы перечислить их все. Но все они говорят более или менее то же самое, просто используйте негативный взгляд (?!)

Может ли кто-нибудь увидеть, что я делаю неправильно, чтобы это не сработало?

Edit:

добавлены некоторые примеры:

  1. Привет - Должно пройти
  2. ПРИВЕТ - В случае сбоя
  3. ПРИВЕТ - В случае сбоя
  4. ПРИВЕТ - должны терпят неудачу

Расширенная версия:

  1. Hello World - должен пройти
  2. привет мир - должен терпеть неудачу
  3. привет мир - должен терпеть неудачу
  4. привет мир - должен терпеть неудачу
+0

В любом месте в * слове *? Подобно '\ b (?! \ W * \ p {Lu} \ w * \ p {Lu}) \ w + \ b'? –

+0

Не могли бы вы привести несколько примеров с ожидаемым и реальным результатом? –

+0

Хорошо, что бы ни было в предложении, но начиная с всего лишь одного слова на данный момент и пойдет оттуда. Но да где-нибудь в слове. – user1255276

ответ

2

Вы можете использовать следующее регулярное выражение:

^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$ 

См regex demo

Это будет соответствовать пустой строке, тоже, но вы можете использовать + квантор вместо * потребуется, по крайней мере, 1 символ.

Чтобы соответствовать новой строке с этим рисунком, вам нужно будет использовать модификатор RegexOptions.Singleline.

Отрицательный lookahead (?!.*\b\w*\p{Lu}\w*\p{Lu}), привязанный к началу строки, не будет соответствовать совпадению после того, как будет найдено слово, которое начинается с нуля или более символов слова, а затем заглавной буквы, за которым следуют ноль или более символов слова, а затем снова Прописная буква. Вы можете сократить это с помощью предельного квантификатора: ^(?!.*\b(?:\w*\p{Lu}){2}).*$.

+1

Спасибо, stribizhev, похоже, это работает :) – user1255276

+0

Совпадения 'The Hello-World Corporation', но не' The HelloWorld Corporation' – sln

+0

Это правильно в соответствии с требованиями. –

1

Вам нужно только провалить матч, если вам пытаются что-то сопоставить.

То, что вы пытаетесь найти, - это сбой.

если [A-Z].*?[A-Z] соответствует строке содержит 2 буквы.

Если не два подряд, это его (многоканальный) ->^[^A-Z\r\n]*(?:[A-Z](?![A-Z])[^A-Z\r\n]*)*$

Чтобы соответствовать непустая строка, просто добавьте простое утверждение.

^(?!$)[^A-Z\r\n]*(?:[A-Z](?![A-Z])[^A-Z\r\n]*)*$

Для свойств Unicode, используйте форму \p{Lu}

^[^\p{Lu}\r\n]*(?:\p{Lu}(?!\p{Lu})[^\p{Lu}\r\n]*)*$


Входной сигнал:

1.Hello - Should pass 
2.HEllo - Should fail 
3.heLLo - Should fail 
4.HELLO - should fail 

Advanced version: 
1.Hello World - should pass 
2.Hello WOrld - should fail 
3.hello wORld - should fail 
4.hello WORLD - should fail 

Тест

Regex1: ^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$ 
Options: < ICU - m > 
Completed iterations: 80/80  (x 1000) 
Matches found per iteration: 5 
Elapsed Time: 8.28 s, 8279.28 ms, 8279281 µs 


Regex2: ^[^\p{Lu}\r\n]*(?:\p{Lu}(?!\p{Lu})[^\p{Lu}\r\n]*)*$ 
Options: < ICU - m > 
Completed iterations: 80/80  (x 1000) 
Matches found per iteration: 5 
Elapsed Time: 3.88 s, 3875.04 ms, 3875039 µs 
+0

не может этого сделать, его файл синтаксического анализа с шаблоны регулярных выражений в файле, и все шаблоны в файле должны находиться в состоянии перехода. – user1255276

+0

Спасибо sln. Ценю вашу помощь. – user1255276

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