用于在Javascript

时间:2016-09-02 10:16:58

标签: javascript java regex validation

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

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

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

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

  1. 包名称只能由字母,数字,点和下划线组成。
  2. 包裹名称必须始终以<(或使用下划线)开始,但绝不能带有数字或带点
  3. 包名称​​可选包含由以下内容构成的模式序列:一个点,后跟一个可以以字母和下划线开头但不包含数字的单词。
  4. 包名称必须始终以非点字符结束
  5. 软件包名称必须按惯例以小写字母开头(Java允许使用大写的起始软件包名称,即使不鼓励它们)
  6. 此正则表达式匹配,例如这些包名称:

    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保留字?

    由于

1 个答案:

答案 0 :(得分:2)

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

我已经构建了这个并且它完美运行:

(?!^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. 我测试过它:

    while1.package2.void3.transient4
    

    它有效。