正则表达式匹配,除非模式在另一个模式之后

时间:2016-03-18 16:13:10

标签: ruby regex

我希望找到python函数的方法名称。我只想查找方法名称,如果它们不在"def "之后。 E.g:

"def method_name(a, b):" # (should not match)
"y = method_name(1,2)"   # (should find `method_name`)

我目前的正则表达式为/\W(.*?)\(/

2 个答案:

答案 0 :(得分:2)

str = "def no_match(a, b):\ny = match(1,2)"
str.scan(/(?<!def)\s+\w+(?=\()/).map(&:strip)
#⇒ ["match"]

正则表达式评论:

  • def的负面反馈,
  • 后跟空格(稍后将删除),
  • 后跟一个或多个文字符号\w
  • 后面是括号的正向前瞻。

Sidenote :永远不要使用regexp来解析任何用途的长字符串。

答案 1 :(得分:0)

我假设不包含“def”的行的形式为“[something] = [零或多个空格] [方法名称]”。

R1 = /
     \bdef\b   # match 'def' surrounded by word breaks
     /x        # free-spacing regex definition mode 

R2 = /
     [^=]+      # match any characters other than '='
     =          # match '='
     \s*        # match >= 0 whitespace chars
     \K         # forget everything matched so far
     [a-z_]     # match a lowercase letter or underscore
     [a-z0-9_]* # match >= 0 lowercase letters, digits or underscores
     [!?]?      # possibly match '!' or '?'
     /x         

def match?(str)
  (str !~ R1) && str[R2]
end

match?("def method_name1(a, b):") #=> false 
match?("y = method_name2(1,2)")   #=> "method_name2" 
match?("y = method_name")         #=> "method_name" 
match?("y = method_name?")        #=> "method_name?" 
match?("y = def method_name")     #=> false 
match?("y << method_name")        #=> nil 

我选择使用两个正则表达式来处理我的第一个和倒数第二个例子。请注意,该方法返回方法名称或伪造值,但后者可能是falsenil