【问题标题】:Need help on validating domains on the basis of ASCII and BASE64 encoded UTF-8 string在基于 ASCII 和 BASE64 编码的 UTF-8 字符串验证域方面需要帮助
【发布时间】:2016-01-15 12:41:29
【问题描述】:

我正在使用 JDK 1.7

在 java 中做一些与 ldap 相关的测试

我有一个配置文件,我正在从中读取一个属性的值,例如“dc=domain1,dc=com”,以便稍后将其传递给 ldap 以进行搜索操作。

这里我想验证来自属性文件的值,该值应该只是 ASCII 或 Base64 编码的 UTF-8 字符串。

我已经编写了以下正则表达式来验证字符串,但似乎有一些问题。

这是我的示例代码:

public class ValidateDN {

    public static void main(String[] args) {

        String istr = "dc=domain1,dc=com";
        String myregex = "^dc=[a-zA-Z0-9\\-\\.]*[,dc=[a-zA-Z0-9\\-\\.]*]*";

        if (istr.matches(myregex)){
            System.out.println("String matches");
        }
        else{
            System.out.println("String not matching");
        }

    }
}

它应该传递所有字符串,例如:

dc=com
dc=domain1,dc=com
dc=domain2,dc=domain1,dc=com

值应该失败:

dc=domain1,dc=com,d
dc=domain1,dc=com,dc

(不完整的键或无效的语法)

谁能建议在这里应该做些什么来正确验证这一点?

【问题讨论】:

  • 它失败是因为 com,dc 中间有一个 , 对吧?
  • 是的,它应该会失败......但是这个正则表达式通过它并打印为“字符串匹配”
  • 嗯,我会选择一个更简单的解决方案。用逗号istr.split(",") 分割字符串,然后为数组的每个元素检查是否有一个字符串后跟=。是的,执行可能需要更多时间,但维护会容易得多。
  • @AmitG,您的代码似乎没有进行任何 ASCII 检查或 base64 验证
  • 你能指导我如何有效地进行这项检查吗?

标签: java regex validation


【解决方案1】:

您的正则表达式中有一个重大错误 - 您使用的是方括号而不是括号。方括号表示:“任何字符”,而不是字符序列。

此外,您的正则表达式可以简化为:

(dc=[\w-]+,?)*

由于 LDAP DN 可能包含空格,您可能需要考虑使用:

(\s*dc\s*=\s*[\w-]+\s*,?)*

记得在插入代码时根据需要转义斜杠。

【讨论】:

    【解决方案2】:

    我相信您遇到的问题是由于您的正则表达式的结构。

    你的正则表达式:

    "^dc=[a-zA-Z0-9\\-\\.]*[,dc=[a-zA-Z0-9\\-\\.]*]*"
    

    第二个字符类有一个缺陷。具体来说:

    (`[,dc=[a-zA-Z0-9\\-\\.]*]*.
    

    为了使文字 ",dc=" 匹配以及内部字符类匹配,应将其更改为 (,dc=[a-zA-Z0-9\\-\\.]*)*

    应该工作的完整正则表达式是:

    ^dc=[a-zA-Z0-9\\-\\.]*(,dc=[a-zA-Z0-9\\-\\.]*)*
    

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多