【问题标题】:Regular expression to validate a Java package name in Javascript在 Javascript 中验证 Java 包名称的正则表达式
【发布时间】:2017-01-10 10:15:36
【问题描述】:

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

最简单的方法是匹配单词和点的列表,所以我实现了这个正则表达式:

(^(?:[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$)

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

  1. 包名只能由字母、数字、点和下划线组成。
  2. 包名称必须始终以单词(或下划线)开头,但不能以数字或点开头
  3. 包名称可以可选地包含由以下组成的模式序列:一个点,后跟一个可以以字母和下划线开头但不能以数字开头的单词。
  4. 包名必须始终以非点字符结尾
  5. 包名必须按照约定以小写字母开头(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


【解决方案1】:

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

我已经构建了这个,它运行良好:

(?!^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. 包名不能在点之间包含保留字

我已经测试过了:

while1.package2.void3.transient4

它有效。

【讨论】:

  • 不是我见过的最易维护的代码,但让它工作起来对你有好处:-)
  • 是的,我知道...副作用是正则表达式中直接有java保留术语的常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多