我试图使用向后引用来匹配在启用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行。
请考虑以下数据示例:
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;
}
答案 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')