我得到了这个正则表达式(?<==).*?\)(\w|)+
,它捕获=
之后的所有文本,直到右括号为止。
我需要对此进行改进,排除第二个matchdata,我不需要在“ objectClass” 之后的字符串,我只需要从第一个matchdata中选择括号
这是我到目前为止所取得的成就
答案 0 :(得分:1)
一个选项可能是:
(?<!objectClass=)(?<==)[^()]+(?:\([^)]+\)[^()]*)+
那将匹配:
(?<!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"]