我有一个regex模式来检查输入电话号码。Regex模式是:
(@"((?:\(?[2-9](?(?=1)1[02-9]|(?(?=0)0[1-9]|\d{2}))\)?\D{0,3})(?:\(?[2-9](?(?=1)1[02-9]|\d{2})\)?\D{0,3})\d{4})"
这对于服务器端验证很好,而对于客户端则失败。我拿到Invalid group error
了。
我对regex相当陌生,通过深入研究,我发现这是因为JS不支持查找。
我试着应用-逆字符串技术,但是模式太复杂了。有人能帮忙吗。提前谢谢。
发布于 2020-12-04 18:12:41
您的所有条件构造都需要替换为一个非捕获组,该组在开始时包含一个负的前瞻性。一般来说,看起来就像
(?(?=0)01|\d{2}) = (?:(?=0)01|(?!0)\d{2})
也就是说,将条件组转换为非捕获组,并向组中的每个选项添加限制。如果下一个字符是(?:(?=0)01|(?!0)\d{2})
,则01
匹配,否则,如果下一个字符不是0
,则匹配任何两位数(当然,如果它们以0
开头)。
所以,在你的具体情况下,改变
(?(?=1)1[02-9]|(?(?=0)0[1-9]|\d{2}))
-> (?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))
(?(?=1)1[02-9]|\d{2})
-> (?:(?=1)1[02-9]|(?!1)\d{2})
PCRE模式的确切JavaScript等效值是
((?:\(?[2-9](?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))\)?\D{0,3})(?:\(?[2-9](?:(?=1)1[02-9]|(?!1)\d{2})\)?\D{0,3})\d{4})
见regex演示。
但是,有些分组是多余的,因此可以将其缩短为
\(?[2-9](?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))\)?\D{0,3}\(?[2-9](?:(?=1)1[02-9]|(?!1)\d{2})\)?\D{0,3}\d{4}
https://stackoverflow.com/questions/65147061
复制相似问题