【发布时间】:2017-01-10 10:15:36
【问题描述】:
我想在 javascript 中使用正则表达式来验证 Java 包名称。
最简单的方法是匹配单词和点的列表,所以我实现了这个正则表达式:
(^(?:[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$)
此正则表达式确保以下内容:
- 包名只能由字母、数字、点和下划线组成。
- 包名称必须始终以单词(或下划线)开头,但不能以数字或点开头
- 包名称可以可选地包含由以下组成的模式序列:一个点,后跟一个可以以字母和下划线开头但不能以数字开头的单词。
- 包名必须始终以非点字符结尾。
- 包名必须按照约定以小写字母开头(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 保留的单词?
谢谢
【问题讨论】:
-
您可能会使用否定前瞻,以及大量的否定前瞻,以涵盖 Java 的所有关键字。我更喜欢结合使用字符串操作和正则表达式。保留您当前的正则表达式,然后在点上拆分,并检查每个部分是否不是关键字。
-
是的,这是一个练习解决方案:检查每个术语是否是保留字。直接在正则表达式中进行此检查可能太复杂了。
-
@Tim 感谢您的帮助。我自己找到了一个有效的正则表达式,如果你愿意,请检查它。 ;)
标签: javascript java regex validation