Можно ли объединить два регулярных выражения? Как будто он должен соответствовать этому регулярному выражению или другому. В идеале исключительно (xor).
Например, я хочу проверить номер телефона на соответствие регулярному выражению номера стационарного телефона и регулярному выражению номера мобильного телефона.
Хотел бы я сделать что-то подобное, но это не работает:
const landlinePhoneRegExp = /(^1300\d{6}$)|(^1800|1900|1902\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\d{4}$)|(^04\d{2,3}\d{6}$)/
const mobilePhoneRegExp = /^04[0-9 ]+/
const stripOutDelimiters = regex => etc...
const phoneRegExp = `/${stripOutDelimiters(landlinePhoneRegExp)}|${stripOutDelimiters(mobilePhoneRegExp)}/`,
ОБНОВЛЕНИЕ: я забыл добавить, что использую библиотеку Yup для проверки! Код выглядит так:
const validationSchema = (t, i18n) => Yup.object.shape({
phone: Yup.string()
.required(t('formValidationPhoneRequired'))
.matches(localeRegex[i18n.language].phoneRegExp, t('formValidationPhoneInvalid'))
})
Это объясняет, почему я пытался динамически объединить два регулярных выражения в одно, как в нерабочем примере выше.
Я уже некоторое время просматриваю документы, но, похоже, нет способа сделать это. Может быть, lazy()
был бы полезен, но, очевидно, я не могу использовать string.matches()
тогда ... если я не сопоставлю (landlineMatch || mobileMatch)
с boolean (), но как я могу это сделать?
phone: Yup.lazy((value) => {
const landlineMatch = value.match(localeRegex[i18n.language].landlinePhoneRegExp)
const mobileMatch = value.match(localeRegex[i18n.language].mobilePhoneRegExp)
return Yup.string()
.required(t('formValidationPhoneRequired'))
.matches( ??? , t('formValidationPhoneInvalid'))
})
const
, они точно не изменятся. Следовательно, предлагаемое решение достаточно хорошее. - person anubhava   schedule 03.12.2019/
из существующих регулярных выражений и объединить их с|
в соответствии с этим ответом. Вы можете делать это динамически. Верно? - person TKoL   schedule 03.12.2019(^1800|1900|1902\d{6}$)
соответствует строкам, которые начинаются с1800
с любыми символами после (например,1800abcg*$ù^pihybncisgf456
), или строкам, которые имеют1900
где-то посередине (например ,abcdef1900xrs654ehrbt84
), или строкам, которые заканчиваются на1902
, за которым следуют 6 цифр (например,xyz1234561902123456
) - person Toto   schedule 03.12.2019^(?:(04\d{8,9})|(04[0-9 ]+))$
. Последнее чередование накладывается на первое. Другими словами, первое - это подмножество последнего. Тогда это не квалифицируется как исключающее или исключающее ИЛИ. Все, что нужно, - это сначала обычное ИЛИ подмножества. - person   schedule 03.12.2019const combineRegex = (r1, r2) => new RegExp(`${new RegExp(r1).source}|${new RegExp(r2).source}`)
- person zok   schedule 04.12.2019