2016-09-27 7 views
2

Я хочу найти (в VS C#), если строка содержит символ (например, «%») без немедленных повторений.Поиск, если устав существует один в строке C#

Например: «У меня есть только%, и это нормально => %%». Я хочу найти любую строку, содержащую один «%» (даже пару раз), независимо от прилегающих «%%» вхождений.

Далее будет, очевидно, не работает, и даст true для foo2:

string foo1="% I want to find this string"; 
string foo2="I don't want to find this string because the char %% is not alone"; 
string foo3="I%want%to%find%this%as%well!" 
if(line.Contains("%")){} 

Я пытался понять, как применять регулярное выражение здесь То Свободна.

+4

Попробуйте ['(?

+2

Чтобы расширить комментарий Wiktor, прочтите следующее: http://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic- группы – kiziu

+0

Шаблон регулярных выражений: string pattern = "% [^%] +"; – jdweng

ответ

7

Перемещение мой комментарий здесь:

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

if (s.Contains("%") && !s.Contains("%%")) 

Если вам нужно использовать регулярное выражение, вы можете использовать negative lookarounds с Regex.IsMatch :

if(Regex.IsMatch(line, @"(?<!%)%(?!%)")) {} 

См. Это regex demo.

(?<!%) отрицательного просмотра назад потерпит неудачу матч, если % предшествует с % и (?!%) отрицательного предпросмотра потерпит неудачу матч, если % следуют с %.

+2

Ну, я думаю, это также можно сделать как 'if (s.Contains ("% ") &&! S.Contains (" %% ")). Выберите по своему усмотрению :) –

+0

Я сделал приличную вещь и удалил свой ответ, когда понял, что другие избили меня с комментариями и другим ответом. Затем я остановил ваше, поскольку регулярное выражение казалось излишним. Теперь вы положили простое решение в свой ответ, я отменил это на upvote. :) –

+0

@DavidArno: Я очень рад, что вы это объяснили, но регулярное выражение не переборщило. В некоторых случаях, когда нет доступа к самому C# -коду, может помочь только регулярное выражение. Хотя для OP, который не имеет никакого значения, другие пользователи, которые ищут регулярное выражение .NET, найдут код только для ответа недостаточно.Больше, иногда регулярное выражение лучше, чем чистый код (когда есть конкретные требования, и снова невозможно сильно изменить код). Оба решения имеют равное право называться «хорошим» и «рабочим», а решение регулярных выражений не заслуживает ниспроверки. BTW, регулярное выражение достаточно эффективно, протестируйте его, вы увидите –

0

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

Так простое решение, если регулярное выражение не обязательно может быть:

if(line.Contains("%") && !line.Contains("%%")) 
{ 
    // string ok 
} 

Как указывалось другими, вы должны проверить, если % содержится в строке на всех.

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