【问题标题】:What would be the RegularExpression for the followings?以下的正则表达式是什么?
【发布时间】:2010-08-19 22:45:06
【问题描述】:

在针对 Active Directory 执行某些任务时,我需要遵守一个命名法。

这是命名法:

  • TT-EEE-Mnemonic:如果 TT = 'GA' or 'GS' or 'PA' or 'PF' -> 要创建的架构是一个“组”,具有 Global 的 groupScope。
    1. LT-EEE-Mnemonic: if T = 'A' or 'G' or 'I' or 'N' or 'P' -> 要创建的模式是“group”,groupScope 为 Domain local
    2. TTT-EEE-Mnemonic:如果 TTT* = 'CNX' or 'GST' or 'SVC' -> 要创建的 shema 是“用户”
    3. T-SSSS-Mnemonic:如果 T = 'A' or 'L' or 'M' or 'R' or 'S' -> 要创建的模式是“组织单位”

我追求的是比这更简单有效的方法:

If(dn.Substring(3, 2).Contains("GA") _
    Or variable.Substring(3, 2).Contains("GS") _
    Or dn.Substring(3, 2).Contains("PA") _
    Or dn.Substring(3, 2).Contains("PF")) Then 
    schema = "group" ' Global'
Else If(dn.Substring(4, 1).Contains("A") _
    Or dn.Substring(4, 1).Contains("G") _
    Or dn.Substring(4, 1).Contains("I") _
    Or dn.Substring(4, 1).Contains("N") _
    Or dn.Substring(4, 1).Contains("P")) Then
    schema = "group" ' Local'
Else If(dn.Substring(3, 3).Contains("CNX") _
    ' Well... You get the idea, don't you?
End If

我想我可以使用RegularExpression,或者我得到的每个命名法都可以使用一个,类似的东西。

在这种情况下,RegularExpression 是否可以派上用场?还是最好坚持那个旧的大如果?欢迎提出任何建议。

对不起,我不习惯使用RegularExpression。我知道它们的存在,以及它们能做的一些事情,但仅此而已。

谢谢!

【问题讨论】:

    标签: vb.net regex .net-2.0


    【解决方案1】:

    您的代码似乎与您的描述不符。根据您的描述,您可能需要以下正则表达式:

    ^(((GA|GS|PA|PF)|L[AGINP]|(CNX|GST|SVC))-EEE|[ALRMS]-SSSS)$
    

    编辑:您可能想阅读this tutorial 了解正则表达式的含义,特别是查找“字符类”和“分组和替代”部分。

    简而言之,竖线字符(即 |)是“或”运算符。方括号(即 [])是字符类;换句话说,字符之间的“或”。

    【讨论】:

    • 哈哈! (这里需要的字符太多...)
    • @William:我可能会认出我所追求的角色,甚至对RegEx 的建议有点了解。你能不能再解释一下,这样我就不用来打扰了,因为我不习惯一个人写不出来?谢谢你的帮助! =)
    • 由此,我如何才能清楚地区分它是“用户”、“组织单位”、“组”(本地)还是“组”(全局),以便我可以通过基于RegEx 获得的模式传递给我的 Create() 方法?感谢您的宝贵时间。
    • @William:感谢您的解释,并再次感谢教程链接。 =)
    【解决方案2】:

    它会大大减少测试次数和明确的Ors。

    If Regex.IsMatch(dn, "^CN=(G[AS]|P[AF])-") Then
        schema = "group"    ' Global                 'damn syntax highlighting
    ElseIf Regex.IsMatch(dn, "^CN=L[AGINP]-") Then
        schema = "group"    ' Local                  'damn syntax highlighting
    ElseIf Regex.IsMatch(dn, "^CN=(CNX|GST|SVC)-") Then
        schema = "user"
    ElseIf Regex.IsMatch(dn, "^CN=[ALMRS]-") Then
        schema = "organizationUnit"
    End If
    

    【讨论】:

    • @cHao:谢谢!这似乎反映了我的问题背后的想法。
    • @cHao:正则表达式中的 ^ 字符是什么意思?
    • @Will Marcouiller:它将模式锚定到字符串的开头。没有它,模式将匹配(例如)字符串中的任何地方的“CN=GA-”——这可能不是一件坏事,如果由于某种原因你不能保证你正在寻找的是在开始。
    • 在 LDAP 中,distinguishedName 属性始终以对象的名称 (CN) 开头,自下而上与 OU 一起直到域名的结尾。我明白你的意思,但在我的情况下,我绝对需要它在字符串的开头。
    • 那么 ^ 是合适的。 :)
    【解决方案3】:

    怎么样...

    Dim Schema As String = Nothing
    Select Case dn.SubString(3, 2) ' Am not sure about your index of 3 here!
      Case "GA", "GS", "PA", "PS"
        Schema = "group"
    End Select
    
    If IsNothing(Schema) Then
      Select Case ...
    End If
    
    etc.
    

    【讨论】:

    • ...诚然不是正则表达式,但是当存在简单的解决方案时为什么还要麻烦呢?
    • 索引为 3 是因为我得到了要创建的对象的 distinctName 值到底层目录中。其形式为:“CN=TT-EEE-Mnemonic,OU=lowerOU,OU=middleOU,OU=highestOU,DC=my,DC=domain,DC=com”。为了得到TT,我需要访问索引3。=)
    • 即使不是RegEx,这也是一个简单的解决方案,对于必须调试我的代码的同事来说更简单。我同意,如果最好的解决方案不是RegEx,我不会太在意,我只是认为使用它会更简单。 =)
    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2015-06-09
    相关资源
    最近更新 更多