首场比赛后匹配文字

时间:2017-04-03 11:29:30

标签: regex grep

我需要编写一个可以执行以下操作的正则表达式,它应该在匹配的字符串之后返回第一组引号之间的文本,给定引号匹配的字符串不是由不同的字符串继续。所以:

def my_method "param/1" "param2"应该不返回任何内容和

my_method "param/3" "param4"应仅返回“param / 3”

到目前为止,我有(?<!def )my_method (["'])(?:(?=(\\?))\2.)*?\1

但这也与my_method部分不匹配。

1 个答案:

答案 0 :(得分:0)

这是grep的正则表达式,带有perl的帮助,可以检索引号之间的第一个东西:

grep -Po '(?<!def my_method )(?<=my_method )"[^"]*"'

这段代码做了一些断言:

  • 唯一不需要的匹配是以def开头的匹配。我添加了这个是因为我对这个问题的理解有限。
  • my_method和第一组引号之间必须有一个空格。这是由于正则表达式背后的限制。

说明:

  • grep -P适用于perl falvour
  • grep -o仅用于保留匹配的部分
  • (?<!def my_method ) - 这是我们不想要的开始
  • (?<=my_method ) - 这是我们想要的开始。这是一个后视,所以它不会成为比赛的一部分
  • )"[^"]*" - 这就是我们想要的东西:引号之间的东西。

或者,您也可以尝试sed

grep -P '(?<!def)\s*my_method[^"]+"[^"]+"' | sed 's/^[^"]\+\("[^"]*"\).*$/\1/g'