正则表达式使用反向引用匹配所有匹配项

时间:2019-07-08 21:13:46

标签: regex pcre ripgrep

我试图使用向后引用来匹配在启用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 stderr,但找不到原因。文档长度只有161行。

Link to regex101

请考虑以下数据示例:

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;
            }

2 个答案:

答案 0 :(得分:1)

严格执行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]+? \)

答案 1 :(得分:0)

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

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

可以使用ripgrep做同样的事情:

rg -noF 'new ExifInterface(' $(rg -l 'import.*ExifInterface')