matlab regexp, совпадать с любым символом X количество раз - PullRequest
2 голосов
/ 11 октября 2019

Я хочу, чтобы

  • соответствовало a, но не b,
  • любой символ A-Za-z0-9 может содержаться любое количество раз -за исключением этих символов \@\,\., которые могут содержаться только один раз.
  • Общая совпадающая строка должна быть at least 3 characters long.

Как мне этого добиться? Мой подход не работает, и я не смог найти ссылку в документации для этого.

a='em@il';
b='em@@l';
%more examples
a2='em@il, test.'; %<- correct
a3='email, test';  %<- correct
b2='em@il, test,'; %<- incorrect 2x ','
b3='em@ail, test. @bc. %<- incorrect 2x '@'
regexp({a,b},'[A-Za-z0-9 (\@\,\.){1}]{3,}','match','once')
ans =

  1×2 cell array

    {'em@il'}    {'em@@l'}

Ответы [ 3 ]

2 голосов
/ 12 октября 2019

(?!.*(,|\.|@).*\1.*)^[a-zA-Z0-9 @,\.]{3,}$

Это регулярное выражение позволяет сопоставить любое число> = 3 из a-zA-Z0-9 @,., но использует отрицательный прогноз, чтобы утверждать, что ,.@ сопоставляется только один раз в регулярном выражении. Это легко расширить - если вы хотите ограничить дополнительные символы, просто добавьте их в первую группу захвата.

  • (?!.*(,|\.|@).*\1.*) Утверждайте, что: если найден один из ,.@, он неприсутствует где-либо еще в совпадении.
  • ^[a-zA-Z0-9 @,\.]{3,}$ Между началом и концом строки сопоставьте три или более допустимых символа из списка.

Демо

2 голосов
/ 12 октября 2019

Вы можете использовать отрицательный прогноз с обратной ссылкой, чтобы убедиться, что точка, запятая или @ не встречаются дважды, и использовать класс символов с квантификатором {3,}

^(?!.*([,.@]).*\1)[a-zA-Z0-9 @,.]{3,}$

По частям

  • ^ Начало строки
  • (?! Отрицательный прогноз, если то, что справа, не
    • .*([,.@]) Захват , .или @ в группе 1
    • .*\1 Совпадение с тем, что зафиксировано в группе 1, с использованием обратной ссылки
  • ) Закрыть взгляд вперед
  • [a-zA-Z0-9 @,.]{3,} Соответствует любому из перечисленных 3 или более раз
  • $ Конец строки

Regex demo

2 голосов
/ 12 октября 2019

Может быть,

^(?!.*@.*@|.*,.*,|.*\..*\.)[A-Za-z0-9 @,.]{3,}$

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

Демо


Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . При желании вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Источник

Регулярные выражения MATLAB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...