Javascript 如何动态组合两个正则表达式?
两个正则表达式可以合并吗?好像它应该匹配这个正则表达式或其他。理想情况下为独占(xor) 例如,我想根据固定电话号码regex和移动电话号码regex验证电话号码 我希望我能做这样的事情,但它不起作用:Javascript 如何动态组合两个正则表达式?,javascript,regex,yup,Javascript,Regex,Yup,两个正则表达式可以合并吗?好像它应该匹配这个正则表达式或其他。理想情况下为独占(xor) 例如,我想根据固定电话号码regex和移动电话号码regex验证电话号码 我希望我能做这样的事情,但它不起作用: 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
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'))
})
你几乎完成了,你只需要测试他们是否匹配 要测试字符串是否匹配,只需使用:
landlineMatch=str.match(landlinePhoneRegExp)
mobileMatch=str.match(mobilePhoneRegExp)
逻辑异或测试没有捷径,您只需结合使用&
和|
,如下所示:
(陆地线匹配| |移动匹配)&!(陆地线匹配和移动匹配)
如果你单独测试每一个,就会容易得多。OP明确表示,他们希望将它们与Javascript和XOR逻辑动态结合起来,所以我认为这两种方法都不能回答这个问题。@Andrew当然可以,我们在这里讨论的动态性如何,AI?请注意(^1800 | 1900 | 1902\d{6}$)匹配在“代码> > 1800 ABCG*$$(pIHYBNCISGFF66< /COD>)之后开始的、以<代码> 1800代码< /代码>的字符串,或在中间某个地方有<代码> 1900代码/代码>的字符串(即<代码> ABCFD1919XRS654 EHRBT84<代码>)或以<代码> 1902 < /代码>结尾的字符串,后面是6位数字(即<代码> XYZ12345 619212345 6< <代码>)。实际的问题归结为这个^(?(04\d{8,9})|(04[0-9]+)$
。最后一个交替与第一个重叠。换句话说,第一个是最后一个的子集。那么它就不符合独占或XOR的条件。首先需要的是子集的正规或。或(landlineMatch&&!mobileMatch)|(mobileMatch&&!landlineMatch)
或如果(!landlineMatch!==!mobileMatch)
(xor相当于计算不同布尔值的两个表达式,一个为真,另一个为假)