【问题标题】:Validation of Distinguish Name ( DN ) Code in Regex JavaScript验证正则表达式 JavaScript 中的可分辨名称 (DN) 代码
【发布时间】:2020-10-13 15:36:23
【问题描述】:

我想验证 DN 代码在哪里

所有段必须按顺序出现:cn=,ou=,o=,o=swift 逗号 (,) 必须分隔所有段。

最多 100 个小写字符

不允许有空格

段数:最少两个,最多 10 个

细分要求

Segment 遵循 BIC 格式验证,但允许使用 8 个字符。

段由以下字符组成:

最少两个字符。

最多 20 个字符。

字母数字字符:a 到 z(仅小写), 0到9, 和特殊字符'-' 如果段具有值,因为只有数字将包含最多两位数。

我已尝试使用以下正则表达式:

^((CN=([a-zA-Z0-9-,])))?((((?:CN|OU)=[a-zA-Z0-9-,]+,?) +),)?((o=([a-zA-Z]{4})([a-zA-Z]{2})(([0-9a-zA-Z]{1})([ 0-9a-np-zA-NP-Z]))(|([xX]{3})|)+,?)+)?((o=([swift])+,{1})+) $

但它使用以下代码: cn=harsha,ou=treasury,ou=treasury,o=dazppxxx,o=swift,

但没有

cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift"

它也接受

cn=test,cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift," 无效。

请帮忙!!!

【问题讨论】:

  • 为什么第三个例子无效?根据您规定的规则,这似乎是有效的?
  • 因为cn和swift的值是重复的……不应该重复
  • 书面规则不明确,不符合提供的正则表达式。根据您的描述,我想出了这个^CN=((?=\D*\d{0,2}[^\d,])[a-zA-Z0-9-]{2,8}),(OU=((?=\D*\d{0,2}[^\d,])[a-zA-Z0-9-]{2,8}),){2,10}(O=((?=\D*\d{0,2}[^\d,])[a-zA-Z0-9-]{2,8}),){1,9}o=swift,$,但由于要求不完整,它很可能是不完整的。

标签: javascript html regex regex-greedy


【解决方案1】:

这里尝试添加几个测试字符串来测试您的验证规则:

var strings = [
  'cn=harsha,ou=treasury,ou=treasury,o=dazppxxx,o=swift',
  'cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift',
  'cn=test,cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift',
  'cn=t1,cn=t2,ou=t3,ou=t4,ou=t5,ou=t6,ou=t7,ou=t8,ou=t9,ou=t10,ou=t11,o=dazppxxx,o=swift',
  'cn=a,ou=b,ou=c,o=dazppxxx,o=swift',
  'cn=more-than-20-characters,ou=treasury,ou=treasury,o=dazppxxx,o=swift',
  'cn=more-than-100-total1,cn=more-than-100-total2,ou=more-than-100-total3,ou=more-than-100-total4,o=dazppxxx,o=swift'
];
var re = /^(?=[^,]+(,[^,]+){1,9}$)(?=.{1,100}$)(cn=([a-z0-9\-]{2,20}|[0-9]{1,2}),)+(ou=([a-z0-9\-]{2,20}|[0-9]{1,2}),)+(o=([a-z0-9\-]{2,20}|[0-9]{1,2}),)+o=swift$/

strings.forEach(function(str) {
  var result = re.test(str);
  console.log(str + '\n  ==> ' + result);
});

控制台输出:

cn=harsha,ou=treasury,ou=treasury,o=dazppxxx,o=swift
  ==> true
cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift
  ==> true
cn=test,cn=test,ou=treasury,ou=treasury,o=dazppxxx,o=swift
  ==> true
cn=t1,cn=t2,ou=t3,ou=t4,ou=t5,ou=t6,ou=t7,ou=t8,ou=t9,ou=t10,ou=t11,o=dazppxxx,o=swift
  ==> false
cn=a,ou=b,ou=c,o=dazppxxx,o=swift
  ==> false
cn=more-than-20-characters,ou=treasury,ou=treasury,o=dazppxxx,o=swift
  ==> false
cn=more-than-100-total1,cn=more-than-100-total2,ou=more-than-100-total3,ou=more-than-100-total4,o=dazppxxx,o=swift
  ==> false

解释:

  • 正则表达式以肯定的前瞻开始以测试 1-9 逗号,例如2 到 10 段
  • 第二次前瞻测试总共最多 100 个字符
  • 后跟(cn=([a-z0-9\-]{2,20}|[0-9]{1,2}),)+,这意味着cn 有2-20 个字符(小写、数字、破折号)或最多2 位数字
  • ouo 紧随其后
  • 后跟o=swift

你说第三个例子是无效的。根据您规定的规则,我不明白为什么它违反了您规定的规则

【讨论】:

  • 感谢@Sri Harsha 接受这个作为答案。你也会考虑投赞成票吗?还有其他问题吗?
  • Theony, ^(?=[^,]+(,[^,]+){1,9}$)(?=.{1,100}$)(cn=([a- z0-9\-]{2,20}|[0-9]{1,2}){0,1},)+(ou=([a-z0-9\-]{2,20}| [0-9]{1,2}),)+(o=([a-z0-9\-]{2,20}|[0-9]{1,2}),){1}o =swift$ 使用上面的正则表达式,cn 值是重复的,你能帮我吗?我只需要唯一的 cn 值,其余的工作正常......
  • 如果您想要一个cn,只需删除cn 右括号后的+。加号表示前面的内容出现一次或多次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多