0

我正在尝试使用反向引用来匹配所有使用启用选项实例化的导入类的ripgrep出现--pcre2

首先,我想查看是否正在导入一个类,然后返回引用该类以查找它的实例化位置。

  • 第一次尝试:匹配第一次出现的new ExifInterface(str) 我的正则表达式是:(import.+(ExifInterface)).+(new\s\2\(.+\))

  • 第二次尝试:匹配最后一次出现的new ExifInterface(str). 我的正则表达式是(import.+(ExifInterface)).+(?:.+?(new\s\2\(.+\)))

我的ripgrep命令是rg --pcre2 --multiline-dotall -U "(import.+(ExifInterface)).+(new\s\2\(.+?\))" -r '$3' -o

问题。我怎样才能匹配所有的出现new ExifInterface(str)

奖励问题:在某些情况下,我从 得到一个PCRE2: error matching: match limit exceeded标准错误rg,但不知道为什么。文档长度只有 161 行。

链接到正则表达式101

考虑以下数据样本:

import android.graphics.Point;
import android.media.ExifInterface;
import android.view.WindowManager;
import java.io.IOException;

public class MediaUtils {
    /* renamed from: a */
    public static float m13571a(String str) {
        if (str == null || str.isEmpty()) {
            throw new IllegalArgumentException("getRotationDegreeForImage requires a valid source uri!");
        }
        try {
            int attributeInt = new ExifInterface(str).getAttributeInt("Orientation", 1);
            if (attributeInt == 3) {
                return 180.0f;
new ExifInterface(str).getAttributeInt("Orientation", 1);
            }
            if (attributeInt == 6) {
                return 90.0f;
            }
4

2 回答 2

0

在初始
特定匹配之后找到连续匹配的严格 PCRE 正则表达式就是这样。它使用在 最后一个匹配位置停止的地方 \G开始下一次搜索的构造。

(?:import.+\bExifInterface\b|(?!^)\G)[\S\s]+?\K\bnew\s+ExifInterface\s*\([\S\s]+?\)

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

不要使用除//g全局标志以外的任何标志。

扩展:

 (?:
      import .+ \b ExifInterface \b 
   |  
      (?! ^ )
      \G 
 )
 [\S\s]+? 
 \K 
 \b new \s+ ExifInterface \s* \( [\S\s]+? \)
于 2019-07-08T21:42:31.293 回答
0

另一种选择:您可以使用两个grep命令获得所需的内容(第一个返回包含 的每个文件的文件名import.*ExifInterface,第二个查找实例化的位置)。

grep -no 'new ExifInterface(' $(grep -lr 'import.*ExifInterface' *) 

ripgrep 也可以这样做:

rg -noF 'new ExifInterface(' $(rg -l 'import.*ExifInterface')
于 2019-07-08T23:21:36.737 回答