Regex 仅包含[a-zA-Z0-9.-\uz]且最大长度为20且不能以';结尾的字符串的正则表达式语法';最多只能包含两个''; 问题
由于以下情况,我无法获取正则表达式语法:Regex 仅包含[a-zA-Z0-9.-\uz]且最大长度为20且不能以';结尾的字符串的正则表达式语法';最多只能包含两个''; 问题,regex,Regex,由于以下情况,我无法获取正则表达式语法: 长度1-20 只能包含以下字符a-zA-Z0-9。- 不能以 只能出现0、1或2次 输入 通过 以下项目应通过正则表达式验证 dummy.txt dummy.tar.gz .dummy dummy. dummy.dummy.tar.gz dummydummydummy.tar.gz 失败 以下项目应未通过正则表达式验证 dummy.txt dummy.tar.gz .dummy dummy. dummy.dummy.tar.gz dummyd
- 长度1-20
- 只能包含以下字符
a-zA-Z0-9。-
- 不能以
- 只能出现0、1或2次
输入 通过 以下项目应通过正则表达式验证
dummy.txt
dummy.tar.gz
.dummy
dummy.
dummy.dummy.tar.gz
dummydummydummy.tar.gz
失败
以下项目应未通过正则表达式验证
dummy.txt
dummy.tar.gz
.dummy
dummy.
dummy.dummy.tar.gz
dummydummydummy.tar.gz
尝试 以下是我到目前为止使用的语法,它是有效的,但我不知道如何添加“不超过两个
”约束:
^[a-zA-Z0-9.-_]{1,20}(?<!\.)$
^[a-zA-Z0-9.-{1,20}?
谢谢。简短介绍
既然你没有指定正则表达式的味道,我就假设一切都会发生
代码
第1版
^(?!(?:.*\.){3,})[\w.-]{1,20}(?<!\.)$
输出
注意:下文仅显示匹配项
dummy.txt
dummy.tar.gz
.dummy
解释
^
在行首断言位置
(?!(?:.*\){3,})
负前瞻确保以下内容不匹配
(?:.\..*){3,}
匹配以下3次或更多次
*\。
匹配任意字符任意次数,后跟一个点
[\w.-]{1,20}
匹配集合中存在的任何字符(任何单词字符a-zA-Z0-9
、点字符
或连字符减号-
的1到20次)
(?反向查找确保前面的内容与以下内容不匹配
\。
点字符
字面意思
$
在行尾断言位置
附加说明
根据\w
可以匹配其他脚本中的非ASCII字符。
如果您希望确保仅匹配ASCII字符,则可能需要将\w
替换为[a-zA-Z0-9_]
下面的报价是从
\w
代表“单词字符”。它始终与ASCII码匹配
字符[A-Za-z0-9.]
。请注意包含下划线和
数字。在大多数支持Unicode的版本中,\w
包括许多
来自其他脚本的字符。关于
实际包含哪些字符。来自的字母和数字
通常包括字母和表意文字。连接器
除下划线和数字符号以外的标点符号
数字可能包括也可能不包括。XML模式和XPath甚至包括
\w
中的所有符号。同样,Java、JavaScript和PCRE仅匹配
带有\w
的ASCII字符
您应该使用负前瞻(?!)
“并且最多只能包含两个”这并不是说这是不可能的,只是说这不是regex
的工作。还有其他更简单、更优雅的方法来实现这一目标。@axiac你是对的,还有其他更优雅的方法来进行这些检查,但regex确实允许并且是专门设计的-执行这样的任务。(?!(?:..*\){3,})
正是这样做的。@ctwheels(?!(?:[^.]*\){3})
足够快和好了。@WiktorStribiżew谢谢,我已经更新了我的答案以包含该代码(有适当的引用)在一些正则表达式中,\w
不仅匹配a-zA-Z0-9
,还匹配其他字符,如é
。因此,我建议在字符类[]
@RoryO'Kane中明确列出范围。谢谢,我在回答的末尾添加了一个注释,以包含此信息