Java 使用正则表达式访问列表中的项目

Java 使用正则表达式访问列表中的项目,java,regex,list,arraylist,Java,Regex,List,Arraylist,可能重复: 有没有一种方法可以使用正则表达式访问列表中存储的项 以以下代码为例: String jpg = "page1.jpg"; String jpeg = "page-2.jpeg"; String png = "page-003.png"; ArrayList<String> images = new ArrayList<String>(); images.add( jpg ); images.add( jpeg ); images.add( png )

可能重复:

有没有一种方法可以使用正则表达式访问列表中存储的项

以以下代码为例:

String jpg  = "page1.jpg";
String jpeg = "page-2.jpeg";
String png  = "page-003.png";

ArrayList<String> images = new ArrayList<String>();
images.add( jpg );
images.add( jpeg );
images.add( png );

Pattern regex = Pattern.compile( "\\D{4,5}0*1.\\w{3,4}" );
int index = images.indexOf( regex );

if( index != -1 )
    System.out.println( "Did find the string" );
else
    System.out.println( "Didn't find the string" );
String jpg=“page1.jpg”;
String jpeg=“page-2.jpeg”;
String png=“page-003.png”;
ArrayList images=新的ArrayList();
添加(jpg);
图像。添加(jpeg);
添加(png);
Pattern regex=Pattern.compile(\\D{4,5}0*1\\w{3,4});
int index=images.indexOf(regex);
如果(索引!=-1)
System.out.println(“找到字符串了”);
其他的
System.out.println(“未找到字符串”);

上面的代码无法查找字符串
page1.jpg
,而是返回
-1



有没有一种方法可以在不遍历列表和检查字符串是否与正则表达式匹配的情况下实现这一点?

没有。除了子类化
ArrayList
或使用scala、groovy等之外,没有
indexOf
使用
equals
方法,因此您被卡住了

如果您愿意使用暗器,您可以使用使用正则表达式的
equals
方法创建一个自定义类

int index = images.indexOf(new Object() {
    public boolean equals(Object obj) {
        return regex.matches(obj.toString());
    }
});
但我只是重复一下。它更干净。你们是同事,6个月后你们自己会很感激的

上面的代码在查找字符串page1.jpg和 相反,返回-1

它不应该那样工作。ArrayList.indexOf的对象参数应该是您希望位于集合中的对象


你可以做的是扩展ArrayList和重载indexOf来支持模式。

@Aaron Sheffey-我确实看到了这个问题,但是询问者特别想要所有匹配的项目,因为我只想要一个项目(因为不会有多个匹配正则表达式的项目)。我特别问过,是否有一种方法可以在不进行迭代的情况下做到这一点,而迭代是上述问题的答案。@我的头很痛-你为什么如此反对迭代?indexOf在内部使用迭代。@sblundy-我不反对迭代-我只是想知道是否有一种不用迭代的方法。我想强调的是,我的问题与Aaron在评论中链接到的问题有所不同,因为他投票决定结束我的问题。从概念上讲,这个问题与你想做的是一样的,但它使用了不同的搜索机制:@Aaron Sheffey-这至少说明了一个迭代的好理由;)谢谢-自定义类对于我使用它的目的来说有点过分了,所以我只需要迭代(就像你说的,代码越干净越好)