复杂的正则表达式patttern,用于选择不属于特定组的所有用户

时间:2017-07-28 19:58:22

标签: regex

我一直在努力编写这个正则表达式选择模式大约一个小时,我无法理解正则表达式如何处理复杂的模式。

基本上我有一个大约20k用户的列表,其数据如下所示:

  d3c80ef4-ae3c-43dc-8cf1-2dd44db19612:
    group: []
    options:
      name: etcusername
  7cacfa27-da32-49d0-8c6f-f1dced07e8bb:
    group:
    - Duke
    options:
      name: username3
  2b5e7795-fba5-4ae0-9479-a1d14f3e4678:
    group: []
    options:
      name: username2
  e7f8ef7e-0e58-4142-ba0f-763be65e55e3:
    group:
    - Resident
    options:
      name: username1

现在,我想将特定的“群组”列入黑名单。让我们用“Resident”和“Duke”作为例子,一旦我能弄清楚正则表达式(或帮助搞清楚:()我可以填写我想要保留的其他队伍。

这是我到目前为止提出的正则表达式,它只选择每一行而不管组:(

((?!Resident))((?s).+?(name: )(\S)*\b)

我认为这是我需要包含的所有信息,我已经尝试了这么久,我需要继续这样做。如果需要任何其他信息,请在评论中提出,我一定会用所要求的信息更新问题。

2 个答案:

答案 0 :(得分:2)

这样的东西?

/(?m)^\s*group:(?s:(?!\s*-\s*(?:Resident|Duke)(?!\S)).)*?^\s*options:\s*^\s*name:\s*(.*?)\s*$/

https://regex101.com/r/jGU7Hk/1

扩展

 (?m)
 ^ \s* group:
 (?s:
      (?!
           \s* - \s* 
           (?: Resident | Duke )    # Exclude these groups
           (?! \S )
      )
      . 
 )*?
 ^ \s* options: \s* 
 ^ \s* name: \s* 
 ( .*? )                       # (1) Name
 \s* $ 

更新 - 使用ID

/(?m)^\s*([a-fA-F\d]+(?:\s*-\s*[a-fA-F\d]+)+)\s*:\s*^\s*group:(?s:(?!\s*-\s*(?:Resident|Duke)(?!\S)).)*?^\s*options:\s*^\s*name:\s*(.*?)\s*$/

https://regex101.com/r/TJKKIP/1

 (?m)
 ^ 
 \s* 
 (                             # (1 start) GUID
      [a-fA-F\d]+ 
      (?: \s* - \s* [a-fA-F\d]+ )+
 )                             # (1 end)
 \s* : \s* 
 ^ \s* group:
 (?s:
      (?!
           \s* - \s* 
           (?: Resident | Duke )     # Exclude these groups
           (?! \S )
      )
      . 
 )*?
 ^ \s* options: \s* 
 ^ \s* name: \s* 
 ( .*? )                       # (2) Name
 \s* $ 

答案 1 :(得分:1)

这与GUID匹配:跳过排除的组:

^  [0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}:\R(^(?! +- (Resident|Duke)).+\R)+? +name: .+\R