我正在设置一个函数,在其中收集apk文件的列表,然后在For循环中,我声明一个ZipFile密集型文件,以检查lib文件夹下的ABI目录,方法是检查文件是否以“。”结尾。所以”。我能想到的唯一解决方案是使用regex字符串表达式
我已经用\ b,[A-Za-z-0-9] *进行了几次正则表达式尝试,但是我一直收到NullPointerException。我研究了使用带有文件名的正则表达式的解决方案,但对于ZipFile和ZipEntry类的案例却并非如此。目前,这是我目前使用Regex的方法。 (有时regex表达式使我头晕。)
(defmacro cons-stream [a b]
(list 'lazy-seq (list 'cons a (list 'lazy-seq b))))
(defn stream-car [stream] (first stream))
(defn stream-cdr [stream] (rest stream))
(defn stream-map [proc & streams]
(if (empty? (first streams))
'()
(cons-stream (apply proc (map stream-car streams))
(apply stream-map proc (map stream-cdr streams)))))
(defn average [a b] (/ (+ a b) 2.0))
(defn sqrt-improve [guess x]
(average guess (/ x guess)))
(defn sqrt-stream [x]
(def guesses (cons-stream 1.0
(stream-map #(sqrt-improve % x) guesses)))
guesses)
由于ZipEntry值为null,因此当前解决方案给出NullPointerException。我不确定错误是由于我的regex表达式还是表达式起作用,但是对于目录中存在多个“ .so”的情况。甚至可以在ZipFile / ZipEntry中使用Regex吗?
答案 0 :(得分:1)
总之:不。
不支持模式,实际上documentation中没有任何内容表示允许使用模式。您必须遍历ZipFile中的all entries,并检查每一个是否匹配:
Enumeration<? extends ZipEntry> entries = apkDetails.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
String name = entry.getName();
if (entry.startsWith("lib/armeabi-v7a/") && entry.endsWith(".so")) {
// Matching entry found.
}
}
有一句老话,当人们决定用正则表达式解决问题时,一个问题就从一个问题变成了两个问题。如果您不需要正则表达式,则最好不要使用。就您而言,startsWith
和endsWith
就足够了。
我不确定您是否需要对匹配的条目进行操作,还是只想检查它们的存在。如果是后一种情况,则可以使用Stream来简化代码:
boolean hasMatchingEntries =
apiDetails.stream().map(ZipEntry::getName).anyMatch(
name -> name.startsWith("lib/armeabi-v7a/") && name.endsWith(".so"));