【问题标题】:Java8 - use regex expression to find the list of string from string [duplicate]Java8 - 使用正则表达式从字符串中查找字符串列表[重复]
【发布时间】:2017-09-25 07:27:41
【问题描述】:

我创建了一个返回列表的函数。 我正在传递一个字符串“(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 编译器。

谢谢, 阿图尔

【问题讨论】:

标签: regex java-8


【解决方案1】:

在 java-9 中可以通过 Scanner#findAll 获得:

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

【讨论】:

  • 当来源只是一个String时,你可以只使用Matcher.results()。 PS:有趣的是,你设法发布了一个已经结束的问题的答案……
  • @Holger 我认为它关闭前只有纳秒
  • 嗯,现在显示的间隔是 7 分钟。
  • @Holger 这很奇怪!我按下提交后,我立即看到关闭
  • 嗨 Eugene,感谢您的回答,但可以使用 Java 8 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多