Шаблон регулярных выражений - допускает буквенно-цифровое отображение, набор специальных символов, но не определенную последовательность символов.

StackOverflow https://stackoverflow.com/questions/429719

  •  06-07-2019
  •  | 
  •  

Вопрос

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

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

Поэтому разрешите A-Z, a-Z, 0-9 и эти специальные символы '.,&@:?!()$#/\

Я хочу НЕ совпадать, если следующий набор символов встречается где-либо в строке в таком порядке:

&#

Когда я запускаю это регулярное выражение только с "&#" в качестве входных данных, оно не соответствует моему шаблону, я получаю сообщение об ошибке, отлично.Когда я запускаю регулярное выражение с помощью '.,&@:?!()$#/\ABC123 Это соответствует моему шаблону, ошибок нет.

Однако, когда я запускаю его с:

'.,&#@:?!()$#/\ABC123

Это тоже не приводит к ошибке.Я делаю что-то не так с проверкой последовательности &#.

Кто-нибудь может сказать мне, что я сделал не так, я не силен в этих вещах.

Это было полезно?

Решение

Заимствуя метод сопоставления строк, заключенных в кавычки, удалите & из вашего класса персонажей добавьте альтернативу для & нет за которым следует #, и разрешить строке необязательно заканчиваться на &:

^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$

Другие советы

Я бы сделал это в двух частях:

<Ол>
  • Проверьте допустимый набор символов. Для этого я бы искал символы, которые не разрешены, и возвращал бы false, если есть совпадение. Это означает, что у меня есть хорошее простое выражение:
    <Код> [^ A-Za-z0-9' \ & амп; @:.?! () $ # ^]
  • Проверьте запрещенную подстроку. А так как это просто подстрока, я бы даже не использовал регулярное выражение для этой части.
  • Вы не упомянули свой язык, но если в C #:

    bool IsValid(string input)
    {
        return !(   input.Contains("&#")  
                   || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
                );
    }
    

    ^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$

    обратите внимание, что последнее \ экранировано (удвоено) ПОЭТОМУ автоматически превращается \\ в \ если не в обратных значках

    Предполагается, что Perl-совместимый RegExp

    Не совпадать со строкой '& amp; #':

      

    <код> (?! [^ & Амп;] * & амп; #) ^ ([A-Za-z0-9 -», & амп; @:. () $ # / \\?] *) $

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

    Просто к вашему сведению, хотя регулярное выражение Бена Бланка работает, оно сложнее, чем должно быть. Я бы сделал это так:

    ^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
    

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

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

        if (string has sequence "&#")
          return false
        else
          return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
    

    Я полагаю, что ваше второе "главное" регулярное выражение

    ^([A-Za-z0-9-'.,&@:?!()$#/\])$"
    

    имеет несколько ошибок:

    • Он будет тестировать только один символ в вашем наборе
    • Тот Самый \ символ в регулярных выражениях - это токен, указывающий на то, что следующий символ является частью какого-то "класса" символов (напр. \n = - символ перевода строки).Последовательность символов \] на самом деле это приводит к тому, что ваш список в квадратных скобках не завершается.

    Возможно, вам будет лучше использовать

    ^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
    

    Обратите внимание, что символ косой черты представлен двойной косой чертой.

    Тот Самый + символ указывает, что по крайней мере один проверяемый символ должен соответствовать регулярному выражению;если можно передать строку нулевой длины, замените + с помощью *.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top