用于Java包名称的Python正则表达式
我在使用Python确定有效的Java包名称时遇到问题。代码如下:用于Java包名称的Python正则表达式,python,regex,Python,Regex,我在使用Python确定有效的Java包名称时遇到问题。代码如下: packageName = "com.domain.lala" # valid, not rejected -> correct #packageName = ".com.domain.lala" # invalid, rejected -> correct #packageName = "com..domain.lala" # invalid, not rejected -> inco
packageName = "com.domain.lala" # valid, not rejected -> correct
#packageName = ".com.domain.lala" # invalid, rejected -> correct
#packageName = "com..domain.lala" # invalid, not rejected -> incorrect
#packageName = "com.domain.lala." # invalid, not rejected -> incorrect
matchObject = re.match("([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)",
packageName)
if matchObject is not None:
print packageName + " is a package name!"
else:
print packageName + " is *not* a package name!"
Utilities.show_error("Invalid Package Name", "Invalid package name " + packageName + "!", "Ok", "", "")
包名称必须以小写字母或下划线开头,并且每个点后面必须至少有一个小写字母或下划线。所有其他字符可以是小写字母、数字或下划线。不允许点的运行,并且不能以点结束或以点开始
如何解决此问题?在正则表达式末尾添加
$
,以强制匹配完整字符串。现在它只匹配部分字符串,因此它错误地接受了在末尾添加了垃圾的有效包名。您可以改为解析字符串:
def valid_java_package_name(string):
tree = string.split('.')
if len(tree) == 0:
return false
for node in tree:
if not valid_java_package_node(node):
return false
return true
您需要放置线的起点和终点标记。所以正则表达式应该是这样的-
^([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)$
事实上,Java包名称中允许使用大写字母。 他们只是感到气馁,但这是有效的 正则表达式应为:
^([a-zA-Z_]{1}[a-zA-Z0-9_]*(\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*)?$
以下模式对我很有效:
/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/i;
结果可以在这本书中找到
@@哦。。我不是巨蟒。这是通用正则表达式。
[✔] me.unfollowers.droid
[✔] me_.unfollowers.droid
[✔] me._unfollowers.droid
[✔] me.unfo11llowers.droid
[✔] me11.unfollowers.droid
[✔] m11e.unfollowers.droid
[✗] 1me.unfollowers.droid
[✔] me.unfollowers23.droid
[✔] me.unfollowers.droid23d
[✔] me.unfollowers_.droid
[✔] me.unfollowers._droid
[✔] me.unfollowers_._droid
[✔] me.unfollowers.droid_
[✔] me.unfollowers.droid32
[✗] me.unfollowers.droid/
[✗] me:.unfollowers.droid
[✗] :me.unfollowers.droid
[✗] me.unfollowers.dro;id
[✗] me.unfollowe^rs.droid
[✗] me.unfollowers.droid.
[✗] me.unfollowers..droid
[✗] me.unfollowers.droid._
[✔] me.unfollowers.11212
[✔] me.1.unfollowers.11212
[✗] me..unfollowers.11212
[✗] abc
[✗] abc.
[✗] .abc