首页 >Java >java教程 >如何在 Java 中以数组形式高效检索所有正则表达式匹配项?

如何在 Java 中以数组形式高效检索所有正则表达式匹配项?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-28 05:50:21987浏览

How to Efficiently Retrieve All Regex Matches as an Array in Java?

以数组形式检索正则表达式匹配

在 Java 中,确定给定模式是否与特定字符串匹配非常简单。然而,当处理多个匹配时,将它们收集到一个数组中可能具有挑战性。为了解决这个问题,请深入研究本指南,了解如何有效地利用正则表达式匹配。

迭代方法

要将匹配累积到数组中,请结合使用 Matcher 和String:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

...

List<String> allMatches = new ArrayList<>();
Matcher m = Pattern.compile("your regular expression here")
    .matcher(yourStringHere);
while (m.find()) {
  allMatches.add(m.group());
}

此代码建立一个 Matcher 对象,该对象系统地查找输入字符串中的匹配子字符串。每个成功的匹配都会附加到 allMatches 列表中。最后,使用 allMatches.toArray(new String[0]) 将其转换为数组:

String[] matchesArr = allMatches.toArray(new String[0]);

用于 Lazier Matches 的自定义可迭代

或者,考虑实现惰性迭代器遍历并立即消耗匹配项,而无需不必要的操作处理:

public static Iterable<MatchResult> allMatches(
    final Pattern p, final CharSequence input) {
  return new Iterable<MatchResult>() {
    public Iterator<MatchResult> iterator() {
      return new Iterator<MatchResult>() {
        // Internal Matcher
        final Matcher matcher = p.matcher(input);
        // Lazy-filled MatchResult
        MatchResult pending;

        public boolean hasNext() {
          if (pending == null && matcher.find()) {
            pending = matcher.toMatchResult();
          }
          return pending != null;
        }

        public MatchResult next() {
          if (!hasNext()) { throw new NoSuchElementException(); }
          MatchResult next = pending;
          pending = null;
          return next;
        }

        public void remove() { throw new UnsupportedOperationException(); }
      };
    }
  };
}

使用如下:

for (MatchResult match : allMatches(
    Pattern.compile("[abc]"), "abracadabra")) {
  System.out.println(match.group() + " at " + match.start());
}

以上是如何在 Java 中以数组形式高效检索所有正则表达式匹配项?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn