regex - 非连续字符的正则表达式
问题描述
我正在尝试创建一个验证以下要求的正则表达式:
- 可以同时使用西里尔字母和数字(没有空格和特殊字符)
- 可以同时使用拉丁语和数字(没有空格和特殊字符)
- 不能同时使用西里尔文和拉丁文字符
- 第一个字母必须大写,不能是数字
- 序列长度 - 从 2 到 16 位(含)
- 不可能连续使用 3 个或更多相同的符号
我正在使用以下解决方案:
(?:([A-Z][A-Za-z0-9]{1,15}|[А-Я][А-ЯЁа-яё0-9]{1,15}))$
如何更改正则表达式以匹配最后一个要求?我使用谷歌表格,其中不可能使用负前瞻。对不起我的英语不好。
解决方案
我不知道你可以用一个没有后视的正则表达式来做到这一点。
但是有“不要重复相同字符 3 次”功能的解决方法。
如果 RE2 支持反向引用,解决方法可能会更简单,但它不支持。所以生成的规则会更长。
您可以定义这样的列ValidNoThreeRepeats
:
=
NOT(
OR(
AND(MID(A1;1 ;1)=MID(A1;2 ;1);MID(A1;2 ;1)=MID(A1;3 ;1));
AND(MID(A1;2 ;1)=MID(A1;3 ;1);MID(A1;3 ;1)=MID(A1;4 ;1));
AND(MID(A1;3 ;1)=MID(A1;4 ;1);MID(A1;4 ;1)=MID(A1;5 ;1));
AND(MID(A1;4 ;1)=MID(A1;5 ;1);MID(A1;5 ;1)=MID(A1;6 ;1));
AND(MID(A1;5 ;1)=MID(A1;6 ;1);MID(A1;6 ;1)=MID(A1;7 ;1));
AND(MID(A1;6 ;1)=MID(A1;7 ;1);MID(A1;7 ;1)=MID(A1;8 ;1));
AND(MID(A1;7 ;1)=MID(A1;8 ;1);MID(A1;8 ;1)=MID(A1;9 ;1));
AND(MID(A1;8 ;1)=MID(A1;9 ;1);MID(A1;9 ;1)=MID(A1;10;1));
AND(MID(A1;9 ;1)=MID(A1;10;1);MID(A1;10;1)=MID(A1;11;1));
AND(MID(A1;10;1)=MID(A1;11;1);MID(A1;11;1)=MID(A1;12;1));
AND(MID(A1;11;1)=MID(A1;12;1);MID(A1;12;1)=MID(A1;13;1));
AND(MID(A1;12;1)=MID(A1;13;1);MID(A1;13;1)=MID(A1;14;1));
AND(MID(A1;13;1)=MID(A1;14;1);MID(A1;14;1)=MID(A1;15;1))
)
)
或者以这样的紧凑方式:
=NOT(OR(AND(MID(A1;1 ;1)=MID(A1;2 ;1);MID(A1;2 ;1)=MID(A1;3 ;1));AND(MID(A1;2 ;1)=MID(A1;3 ;1);MID(A1;3 ;1)=MID(A1;4 ;1));AND(MID(A1;3 ;1)=MID(A1;4 ;1);MID(A1;4 ;1)=MID(A1;5 ;1));AND(MID(A1;4 ;1)=MID(A1;5 ;1);MID(A1;5 ;1)=MID(A1;6 ;1));AND(MID(A1;5 ;1)=MID(A1;6 ;1);MID(A1;6 ;1)=MID(A1;7 ;1));AND(MID(A1;6 ;1)=MID(A1;7 ;1);MID(A1;7 ;1)=MID(A1;8 ;1));AND(MID(A1;7 ;1)=MID(A1;8 ;1);MID(A1;8 ;1)=MID(A1;9 ;1));AND(MID(A1;8 ;1)=MID(A1;9 ;1);MID(A1;9 ;1)=MID(A1;10;1));AND(MID(A1;9 ;1)=MID(A1;10;1);MID(A1;10;1)=MID(A1;11;1));AND(MID(A1;10;1)=MID(A1;11;1);MID(A1;11;1)=MID(A1;12;1));AND(MID(A1;11;1)=MID(A1;12;1);MID(A1;12;1)=MID(A1;13;1));AND(MID(A1;12;1)=MID(A1;13;1);MID(A1;13;1)=MID(A1;14;1));AND(MID(A1;13;1)=MID(A1;14;1);MID(A1;14;1)=MID(A1;15;1))))
这个想法是有一个比较第一个、第二个和第三个字符的规则,然后是另一个比较第二个、第三个、第四个的规则,然后是第三个、第四个、第五个等等的另一个规则,依此类推。你用 加入这个规则OR
,因为如果其中任何一个匹配,这意味着在某个地方存在一些重复。最后,你用 a 否定整个表达式NOT
您可以检查您的正则表达式和该列是否有效。
推荐阅读
- php - 获取复杂的集合在 laravel 中使用“with”方法获取更深层次的关系模型
- c# - Blazor Webassembly 应用程序显示来自服务器的图像
- ssl - SSL TrustStore 没有 CA,只有客户端证书
- javascript - 如何在输入中获取选定的时间 - HTML 日历
- windows-10 - 步入 WinDbg 和 Visual Studio 会导致蓝屏
- swift - swift中有自然日志功能吗?
- r - 如何在 R 中使用函数 wald.test
- telegram - Telegram API,带 ftp URL 的 SendMessage,不带 http://
- c# - 谁能告诉我如何将物理文件保存到配置提供的路径 - ASP.NET Core MVC
- python - Pyspark - 将 rfc 2822 列转换为 tymestamp 列