我想编写一个以类名开头的正则表达式模式,并在类名之间加上点,并以类名结束 每个类名,以letter开头。就像java中的类导入一样,
我写了这个模式,但它太复杂而且验证速度慢,我觉得它不能正常工作
^([a-zA-Z]([0-9]|_|[a-zA-Z])*)(([a-zA-Z]([0-9]|_|[a-zA-Z])*)|\\.)*([a-zA-Z]([0-9]|_|[a-zA-Z])*)$
例如我的输入字符串应该是这样的:“com.casp.common.StringUtils”
答案 0 :(得分:2)
以下内容有什么问题:
^([a-zA-Z][a-zA-Z0-9_]*\.?)+$
只要有类名,它就会将类名与其中的任意数量的包匹配。如果您需要至少两个实例,以下内容也可以正常工作:
^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$
答案 1 :(得分:2)
首先,简化:
[0-9]|_|[a-zA-Z]
可以合并为
[0-9_a-zA-Z]
实际上它有一个简写表示
\w
所以你的正则表达式首先可以简化为这种等效形式:
^([a-zA-Z](\w)*)(([a-zA-Z](\w)*)|\.)*([a-zA-Z](\w)*)$
现在,我们可以通过删除一些冗余捕获组来进一步简化,并且打开不区分大小写的匹配:
^[a-z]\w*([a-z]\w*|\.)*[a-z]\w*$
当然这个正则表达式不正确,例如匹配a....b
。
问题是因为\.
是一个“替代”,不应该是,因为每个组件之间的点是必需。所以它应该转变为:
^[a-z]\w*([a-z]\w*\.)*[a-z]\w*$
但它仍然不正确,因为它与a.b
不匹配,因为它是主要部分。我们需要删除它:
^([a-z]\w*\.)*[a-z]\w*$
并且可能重新排列它,使得重复部分位于结尾,而不是开始:
^[a-z]\w*(\.[a-z]\w*)*$