【问题标题】:Regex match on array (Java) [closed]数组上的正则表达式匹配(Java)[关闭]
【发布时间】:2012-12-22 12:11:49
【问题描述】:

在 Java 中,我有一个 String[] 的文件路径。我需要一个函数来获取String[] 返回,其中包含与指定正则表达式匹配的所有字符串。

Java 有内置函数吗?还是我必须自己做?

【问题讨论】:

  • 您的代码将只是一个构建新数组的循环。写的有问题吗?
  • 你必须自己做。如果您担心性能,您甚至可能想查看 3rd 方正则表达式实现,例如 jregex jregex.sourceforge.net
  • @dystroy 不,没有问题,但是内置函数会更整洁。无论如何,谢谢,作为答案提交,我会接受!
  • @CamilStaps Java 没有内置数组映射功能。有很多库抽象了这个过程,显然很容易编写自己的。

标签: java regex arrays function


【解决方案1】:

你必须做一个循环并逐个字符串检查字符串

public static void main(String args[]) {
    String[] a = {"1", "a", "b" };
    List<String> b = new ArrayList<String>();
    for (int i=0; i<a.length; i++) {
        if (a[i].matches("(a|b)")) { // matches uses regex
            System.out.println("Match " + a[i]);
            b.add(a[i]);
        }
    }
}

点赞乞丐:

public static void main(String args[]) {
    String[] a = {"1", "a", "b" };
    String [] res;
    List<String> b = new ArrayList<String>();
    Pattern p = Pattern.compile("(a|b)");
    Matcher m;
    for (int i=0; i<a.length; i++) {
        m = p.matcher(a[i]);
        if (m.matches()) {
            System.out.println("Match " + a[i]);
            b.add(a[i]);
        }
    }
    res = (String[]) b.toArray();
}

更干净:

private static String[] getMatches(String[] strings) {
    Pattern p = Pattern.compile("(a|b)");
    List<String> matches = new ArrayList<String>();

    for (String s : strings) {
        if (p.matcher(s).matches()) {
            matches.add(s);
        }
    }

    return (String[]) matches.toArray();
}

【讨论】:

  • 您应该只编译一次正则表达式。这样做并从数组列表中添加一个数组的最终构建,你会得到我的支持。
  • 只是因为我真的很无聊
【解决方案2】:

Java SE 中没有这样的函数来处理字符串数组。但是,如果您直接使用文件系统,那么您可以使用

    String[] files  = new File("dir").list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.matches(regex);
        }
    });

【讨论】:

    【解决方案3】:

    我要做的一件事是将字符串数组变成一个列表对象。

    List<String> listFiles = Arrays.asList(strFiles);
    

    正如 beder 所指出的,迭代 for 循环示例可能是最简单、最安全的方法。

    仅使用标准库的唯一其他方法是创建一个迭代器对象并从列表中删除任何不匹配的元素。

    //Sudo-code
    Iterator<String> iterator = listFiles.iterator();
    Pattern pattern = new Pattern("foo");
    while(iterator.hasNext()){
        String file = iterator.next();
        Matcher matcher = pattern.matcher(file);
        if(!matcher.matches()){
            iterator.remove();
        }
    }
    

    在标准库之外,您可能想看看一些函数式编程库。 Apache-commons、Guava 和 lambdaJ 是唯一能想到的。

    匹配器只是一个谓词函数,因此您可以轻松地环绕称为过滤器的高阶函数。此示例是使用 apache-commons 语法编写的。他们如何制作谓词和闭包对象有一些样板。如果您想要更清洁的东西,请使用 lambbdaJ,因为它是建立在 hamcrest 之上的。

    public class MatchesPattern implements Predicate{
        Pattern pattern;
        public MatchesPattern(String strPattern){
            this.pattern = new Pattern(strPattern);
        }
    
        @Override
        public boolean evaluate(Object input) {
    
            if( input instanceof String){
                Matcher matcher = pattern.matcher((String)input);
                return matcher.matches();
            }
            return false;
        }
    }
    
    public void foo(String[] strFiles){
        List<String> files = Arrays.asList(strFiles);
        CollectionUtils.filter(files, new MatchesPattern("bar"));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多