排除matchdata并仅在正则表达式中选择括号

时间:2018-09-05 14:29:31

标签: ruby regex

我得到了这个正则表达式(?<==).*?\)(\w|)+,它捕获=之后的所有文本,直到右括号为止。

我需要对此进行改进,排除第二个matchdata,我不需要在“ objectClass” 之后的字符串,我只需要从第一个matchdata中选择括号

这是我到目前为止所取得的成就

http://rubular.com/r/9TMcrGT1of

2 个答案:

答案 0 :(得分:1)

一个选项可能是:

(?<!objectClass=)(?<==)[^()]+(?:\([^)]+\)[^()]*)+

Regex demo

那将匹配:

  • (?<!objectClass=)断言左侧的负数不是objectClass=
  • (?<==),肯定在左边的是等号
  • [^()]+一次或多次不匹配左括号或右括号
  • (?:
    • \(比赛开头括号
    • [^)]+一次或多次不匹配右括号
    • \)匹配右括号
    • [^()]*,其后没有匹配开括号或闭括号的次数不超过零次
  • )+关闭非捕获组并重复一次或多次

答案 1 :(得分:0)

以下内容不取决于空格的存在。

r = /
    (?<!objectClass) # do not match "objectClass"
    =                # match "="
    .*?              # match any number of characters lazily
    (?=\))           # match a right parentheses in a positive lookahead
    /x               # free-spacing regex definition mode

test=<<_.lines.map(&:chomp)
(&(cn=Te(st)ing) (objectClass=group))
(&(cn=Te(st)ing)(objectClass=group))
(&(cn=Banana (maca)) (objectClass=group))
(&(cn=Banana (maca))(objectClass=group))
_

test.each { |s| puts "#{s} -> #{s.scan r}" }
(&(cn=Te(st)ing) (objectClass=group))     -> ["=Te(st"]
(&(cn=Te(st)ing)(objectClass=group))      -> ["=Te(st"]
(&(cn=Banana (maca)) (objectClass=group)) -> ["=Banana (maca"]
(&(cn=Banana (maca))(objectClass=group))  -> ["=Banana (maca"]