Это моя строка, которая всегда начинается с алфавита, за которым следуют 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
всегда постоянны@HansKilian Является ли Regex дорогой операцией?
Думаю, подстроку проще кодировать и читать.
Сначала используйте флаг без учета регистра, а затем при повторении токенов используйте {<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]
@fubo Это происходит с флагом без учета регистра. Который он упоминает для использования.
что (?i) здесь
@bdebaere Лучше избегать \d
, когда вы не используете хочу, чтобы, возможно, совпадать с другие цифровые символы - лучше быть как можно более конкретным
@kudlatiger (?i)
— флаг без учета регистра
Дефис, R и N всегда постоянны. это не изменится в этих позициях
@kudlatiger Посмотрите на ссылку regex101 - кажется, она работает нормально
Давайте продолжить обсуждение в чате.
Это должно работать:
[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}
- соответствует четырем цифрам
отметит как ответ! Но он также должен поддерживать строчные буквы! [а-я]
Существует параметр регулярного выражения, который делает его нечувствительным к регистру, что делает его более простым.
@bradbury9 Да, вы правы, но я предпочитаю использовать флаги только тогда, когда это очень нужно.
Если бы это всегда был фиксированный формат, я бы разделил его, используя подстроку, а не регулярное выражение.