在Javascript中验证Java包名的正则表达式

Regular expression to validate a Java package name in Javascript

本文关键字:包名 正则表达式 Java 验证 Javascript      更新时间:2023-09-26

我想在javascript中使用正则表达式来验证Java包名。

最简单的方法是匹配单词和点的列表,所以我实现了这个regex:
(^(?:[a-z_]+(?:'d*[a-zA-Z_]*)*)(?:'.[a-z_]+(?:'d*[a-zA-Z_]*)*)*$)

此正则表达式确保以下内容:

  1. 包名只能由字母、数字、点和下划线组成。
  2. 包名必须始终以单词(或下划线)开头,但绝不能以数字或点
  3. 开头
  4. 包名可以可选地包含一个模式序列:一个点,后面跟着一个可以以字母和下划线开头但不能以数字开头的单词。
  5. 包名必须以非点字符结束
  6. 包名必须按照约定以小写字母开头 (Java允许以大写字母开头的包名,即使不鼓励这样做)

这个正则表达式匹配以下包名:

com
com.test
com.test.regex
_com._123
comTest.regEx

和这些包名不匹配:

123
com.
.com
test.123com
test.123_

这是正确的,但对于我的目的来说还不够,因为如果一个单词是 java保留字,我必须使所有包名无效。

让我们以包名为例:

com.test.package

这个包名在我的正则表达式中是有效的,但是单词package是一个Java保留词,它不能用于Java包名。

有效的包名可以是:

com.test.packageTest
com.test.testpackage

单词package可以是另一个单词的子字符串,但它不能是点之间的单个单词。

我如何修改我的正则表达式,以便用这些规则添加单个单词的验证,避免使用java保留的单词?

谢谢

我想我已经找到了正则表达式。

我已经建立了这个,它的工作完美:

(?!^abstract$|^abstract'..*|.*'.abstract'..*|.*'.abstract$|^assert$|^assert'..*|.*'.assert'..*|.*'.assert$|^boolean$|^boolean'..*|.*'.boolean'..*|.*'.boolean$|^break$|^break'..*|.*'.break'..*|.*'.break$|^byte$|^byte'..*|.*'.byte'..*|.*'.byte$|^case$|^case'..*|.*'.case'..*|.*'.case$|^catch$|^catch'..*|.*'.catch'..*|.*'.catch$|^char$|^char'..*|.*'.char'..*|.*'.char$|^class$|^class'..*|.*'.class'..*|.*'.class$|^const$|^const'..*|.*'.const'..*|.*'.const$|^continue$|^continue'..*|.*'.continue'..*|.*'.continue$|^default$|^default'..*|.*'.default'..*|.*'.default$|^do$|^do'..*|.*'.do'..*|.*'.do$|^double$|^double'..*|.*'.double'..*|.*'.double$|^else$|^else'..*|.*'.else'..*|.*'.else$|^enum$|^enum'..*|.*'.enum'..*|.*'.enum$|^extends$|^extends'..*|.*'.extends'..*|.*'.extends$|^final$|^final'..*|.*'.final'..*|.*'.final$|^finally$|^finally'..*|.*'.finally'..*|.*'.finally$|^float$|^float'..*|.*'.float'..*|.*'.float$|^for$|^for'..*|.*'.for'..*|.*'.for$|^goto$|^goto'..*|.*'.goto'..*|.*'.goto$|^if$|^if'..*|.*'.if'..*|.*'.if$|^implements$|^implements'..*|.*'.implements'..*|.*'.implements$|^import$|^import'..*|.*'.import'..*|.*'.import$|^instanceof$|^instanceof'..*|.*'.instanceof'..*|.*'.instanceof$|^int$|^int'..*|.*'.int'..*|.*'.int$|^interface$|^interface'..*|.*'.interface'..*|.*'.interface$|^long$|^long'..*|.*'.long'..*|.*'.long$|^native$|^native'..*|.*'.native'..*|.*'.native$|^new$|^new'..*|.*'.new'..*|.*'.new$|^package$|^package'..*|.*'.package'..*|.*'.package$|^private$|^private'..*|.*'.private'..*|.*'.private$|^protected$|^protected'..*|.*'.protected'..*|.*'.protected$|^public$|^public'..*|.*'.public'..*|.*'.public$|^return$|^return'..*|.*'.return'..*|.*'.return$|^short$|^short'..*|.*'.short'..*|.*'.short$|^static$|^static'..*|.*'.static'..*|.*'.static$|^strictfp$|^strictfp'..*|.*'.strictfp'..*|.*'.strictfp$|^super$|^super'..*|.*'.super'..*|.*'.super$|^switch$|^switch'..*|.*'.switch'..*|.*'.switch$|^synchronized$|^synchronized'..*|.*'.synchronized'..*|.*'.synchronized$|^this$|^this'..*|.*'.this'..*|.*'.this$|^throw$|^throw'..*|.*'.throw'..*|.*'.throw$|^throws$|^throws'..*|.*'.throws'..*|.*'.throws$|^transient$|^transient'..*|.*'.transient'..*|.*'.transient$|^try$|^try'..*|.*'.try'..*|.*'.try$|^void$|^void'..*|.*'.void'..*|.*'.void$|^volatile$|^volatile'..*|.*'.volatile'..*|.*'.volatile$|^while$|^while'..*|.*'.while'..*|.*'.while$)(^(?:[a-z_]+(?:'d*[a-zA-Z_]*)*)(?:'.[a-z_]+(?:'d*[a-zA-Z_]*)*)*$)

这个正则表达式确保:

  1. 包名不能以一个保留字
  2. 开头和/或结尾。
  3. 包名不能包含点
  4. 之间的保留词。

我已经测试了:

while1.package2.void3.transient4