2015-01-28 5 views
-1

Я пытаюсь проверить строковые данные, используя регулярное выражение. Форма входных данных приведена ниже.Как выразить «с хотя бы одним компонентом»

#[email protected] (valid) 
<--nothing (valid) 
#1X2Y3Z (valid) 
#@4A (valid) 

#[email protected] (invalid) 

@ должны следовать путем сопоставления по меньшей мере, один компонент ([0-9]+)A, ([0-9]+)B или ([0-9]+)C

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

Я написал это регулярное выражение:

#(([0-9]+)X)?(([0-9]+)Y)?(([0-9]+)Z)[email protected](([0-9]+)A)?(([0-9]+)B)?([0-9]+)C)? 

, но он считает #[email protected] действительным.

+2

Вы имеете в виду это '^ @ [ABC] + $'? –

+0

Что вы хотите точно проверить? и какой язык вы используете? – Mohammad

+0

Благодарим вас за помощь, я хочу проверить, представлен ли @ с хотя бы одним компонентом {A, B, C} или более. поэтому «A», «AC», «@» недействительны, «@A», «@AC» действительны и пустая строка также действительна. и я использую std: regex – joejo

ответ

1

@ должно быть представлено хотя бы одним компонентом {A, B, C} или более, а пустая строка также действительна.

^(?:@[ABC]+)?$ 

+ повторяет предыдущие маркера один или несколько раз, так что [ABC]+ соответствует одному или нескольким A или B или C. ^ называемых стартовому якорь и $ называемого конца линии якоря.

Update:

^(?:#(?:@?[0-9]+[ABCXYZ])+)?$ 

DEMO

+0

Благодарим за сообщение. и его точно вправо, но если я изменю A, B, C на ([0-9] A) ?, ([0-9] B) ?, ([0-9] C)?, это не работает. в этом случае, как его решить? – joejo

+0

Откуда взялись цифры? Добавьте якоря '^ ([0-9] A)? $', Чтобы он разрешил пустые строки или цифру A как '5A'. –

+0

Я изменил свой вопрос. Спасибо. – joejo

0

Используйте этот один:

^(#(?:[0-9][A-Z])*@?(?:[0-9]|[A-Z])+)?$ 

Я тестировал его с вашими требованиями, как в описании:

@ должен быть представлен хотя бы одним компонентом [([0-9] +) A ([0-9] +) B, ([0-9] +) C].

И # должно существовать перед строкой, если ввод не пустой строки.

+0

Протестируйте его [здесь] (https://regex101.com/r/hA3mF7/1) – JulianG

+0

Как я понимаю, '@' не является обязательным, но если он там, то он должен * следовать * еще несколькими персонажами. Ваше регулярное выражение не говорит об этом. –

+0

thank yous julianG, это работает, но, как я думаю, это полезно только при поиске, а не в совпадении.например, пусть строка ввода «# 9A5B @ 5», ваше регулярное выражение может искать # 9A5B, но не может показать, является ли вход действительным или нет. – joejo

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