Регулярное выражение: первый символ алфавита, второй и далее числовой

Это моя строка, которая всегда начинается с алфавита, за которым следуют 3 цифры, затем - (дефис), затем 3 цифры, затем алфавит, затем 4 цифры.

I123-123S1234N1234

Я придумал регулярное выражение, которое кажется очень длинным! Как я могу написать лучшее выражение для этого?

[a-zA-Z][0-9][0-9][0-9][-][0-9][0-9][0-9][a-zA-Z].........goes on

Примечание

  • Должен поддерживать регистр без учета регистра
  • Дефис, S и N всегда постоянны

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

Hans Kilian 09.04.2019 08:15

@HansKilian Является ли Regex дорогой операцией?

kudlatiger 09.04.2019 08:18

Думаю, подстроку проще кодировать и читать.

Hans Kilian 09.04.2019 08:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
2 171
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Сначала используйте флаг без учета регистра, а затем при повторении токенов используйте {<number of times to repeat>}` вместо повторения себя:

(?i)[a-z][0-9]{3}-[0-9]{3}[a-z][0-9]{4}

Если вы хотите также сопоставить завершающий N1234, то поместите последний [a-z][0-9]{4} в группу и повторите это дважды:

(?i)[a-z][0-9]{3}-[0-9]{3}(?:[a-z][0-9]{4}){2}

https://regex101.com/r/5ra1eU/1

Если S и N постоянны, то не используйте наборы символов для их сопоставления, просто сопоставьте простые символы:

(?i)[a-z][0-9]{3}-[0-9]{3}S[0-9]{4}N[0-9]{4}

https://regex101.com/r/5ra1eU/2

\d также намного короче, чем [0-9]

bdebaere 09.04.2019 07:37

@fubo Это происходит с флагом без учета регистра. Который он упоминает для использования.

bdebaere 09.04.2019 07:38

что (?i) здесь

kudlatiger 09.04.2019 07:38

@bdebaere Лучше избегать \d, когда вы не используете хочу, чтобы, возможно, совпадать с другие цифровые символы - лучше быть как можно более конкретным

CertainPerformance 09.04.2019 07:39

@kudlatiger (?i) — флаг без учета регистра

CertainPerformance 09.04.2019 07:39

Дефис, R и N всегда постоянны. это не изменится в этих позициях

kudlatiger 09.04.2019 07:39

@kudlatiger Посмотрите на ссылку regex101 - кажется, она работает нормально

CertainPerformance 09.04.2019 07:41

Давайте продолжить обсуждение в чате.

kudlatiger 09.04.2019 07:43

Это должно работать:

[a-zA-Z][0-9]{3}-[0-9]{4}[a-zA-Z][0-9]{4}

если вы уверены, что у вас есть заглавная буква и константы S и N:

[A-Z]\d{3}-\d{3}S\d{4}N\d{4}

[A-Z] - соответствует любой заглавной букве

\d{3} - совпадение 3 цифр

S - соответствует букве S

\d{4} - совпадение 4 цифр

N - соответствует N буквально

\d{4} - совпадение 4 цифр

если вы хотите верхний и нижний регистр:

[a-zA-Z]\d{3}-\d{3}[Ss]\d{4}[Nn]\d{4}

или

(?i)[a-z]\d{3}-\d{3}s\d{4}n\d{4}
Ответ принят как подходящий

Попробуй это:

var testString = "I123-123S1234N1234";
var pattern = @"[A-Za-z]\d{3}-\d{3}[sS]\d{4}[nN]\d{4}";
var isMatch = Regex.Match(testString, pattern).Success;

Использован узор: [A-Za-z]\d{3}-\d{3}[sS]\d{4}[nN]\d{4}

Объяснение:

[A-Za-z] - соответствует любой букве

\d{3} - совпадение трех цифр

[sS] - соответствует S или s буквально

\d{4} - соответствует четырем цифрам

[nN] - соответствует N или n буквально

\d{4} - соответствует четырем цифрам

отметит как ответ! Но он также должен поддерживать строчные буквы! [а-я]

kudlatiger 09.04.2019 07:51

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

Cleptus 09.04.2019 08:15

@bradbury9 Да, вы правы, но я предпочитаю использовать флаги только тогда, когда это очень нужно.

Michał Turczyn 09.04.2019 08:17

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