Java8 - 使用regex表达式从字符串中查找字符串列表

时间:2017-09-25 07:27:41

标签: regex java-8

我创建了一个返回List的函数。 我传递一个字符串“(A,1),(Y,4),(F,5)”,我想根据括号将其拆分,得到3个单独的字符串对象,如A,1,Y, 4,F,5作为列表中的3个单独对象。 我使用Java 8来创建它,但它只返回一个像A,1这样的值 功能是:

private List<String> getDataOnRegx(String str) {
    Pattern filerRegx = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");
    Matcher regexMatcher = filerRegx.matcher(str);
    return Stream.of(str).
            filter(s -> regexMatcher.find() && regexMatcher.group(1) != null).
            map(r -> new String(regexMatcher.group(1))).
            collect(Collectors.toList());

}

我通过以下函数实现的预期结果,我没有使用任何Java 8功能:

private List<String> getDataOnRegx(String str) {
Pattern regex = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");
    Matcher regexMatcher = regex.matcher(str);
    List<String>dataList = new ArrayList<String>();
    while (regexMatcher.find()) {
          if (regexMatcher.group(1) != null) {
                dataList.add(regexMatcher.group(1));
          }
    }
    System.out.println(dataList);
    return dataList; 

}

有人可以帮助我获取列表中的所有对象。只是想帮助纠正我已经使用Java 8编写的函数。 严格来说,我必须使用Java 8编译器。

谢谢, 阿图尔

1 个答案:

答案 0 :(得分:4)

通过Scanner#findAll

在java-9中可用
    String test = "(A,1),(Y,4),(F,5)";
    Scanner sc = new Scanner(test);
    Pattern filerRegx = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");

    List<String> results = sc.findAll(filerRegx)
            .map(mr -> mr.group(1))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());

    System.out.println(results);

修改不知道该重复答案如何回答您的问题。你需要做一个非常简单的改变:

  static final class MatchItr extends Spliterators.AbstractSpliterator<String> {
    private final Matcher matcher;

    MatchItr(Matcher m) {
        super(m.regionEnd() - m.regionStart(), ORDERED | NONNULL);
        matcher = m;
    }

    @Override
    public boolean tryAdvance(Consumer<? super String> action) {
        if (!matcher.find()) {
            return false;
        }

        if (matcher.group(1) == null) {
            return false;
        }

        action.accept(matcher.group(1));
        return true;
    }
}

并使用它:

MatchItr mIter = new MatchItr(regexMatcher);
StreamSupport.stream(mIter, false)
            .forEach(System.out::println);