如何使用正则表达式操纵给定的String以获得2个不同的字符串?

时间:2012-06-27 11:39:08

标签: java regex string

我需要做一个字符串操作。最初我将获得一个图像路径作为以下之一:

image = images/registration/student.gif
image = images/registration/student_selected.gif
image = images/registration/student_highlighted.gif

我需要操纵字符串图像路径以获得2个不同的图像路径。

一个是获得路径:

image1 = images/registration/student.gif

为此我使用了以下功能:

private String getImage1(final String image) {
    String image1 = image;
    image1 = image.replace("_highlight", "");
    image1 = image.replace("_selected", "");
    return image1;
}

我需要的第二个图像路径是获取路径:

image2 = image = images/registration/student_selected.gif

我用来获取image2输出的函数是:

private String getImage2(final String image) {
    String image2 = image;
    boolean hasUndersore = image2.matches("_");
    if (hasUndersore) {
        image2 = image2.replace("highlight", "selected");
    } else {
        String[] words = image2.split("\\.");
        image2 = words[0].concat("_selected.") + words[1];
    }
    return image2;
}

但上述方法并没有给我预期的结果。任何人都可以帮助我吗? 非常感谢!

4 个答案:

答案 0 :(得分:2)

你可以使用indexOf(...)而不是match()。匹配将检查整个字符串与正则表达式。

for (final String image : new String[] { "images/registration/student.gif", "images/registration/student_highlight.gif",
                "images/registration/student_selected.gif" }) {

            String image2 = image;
            final boolean hasUndersore = image2.indexOf("_") > 0;
            if (hasUndersore) {
                image2 = image2.replaceAll("_highlight(\\.[^\\.]+)$", "_selected$1");
            } else {
                final String[] words = image2.split("\\.");
                image2 = words[0].concat("_selected.") + words[1];
            }
            System.out.println(image2);
        }

这将为您提供预期的输出。

顺便说一句,我更改了replaceAll(..)正则表达式,因为图像文件名也可以包含字符串“highlight”。例如stuhighlight_highlight.jpg

答案 1 :(得分:1)

如果我理解正确,您需要以下各个功能的输出

"images/registration/student.gif"-> getImage1(String) 
"images/registration/student_selected.gif" -> getImage2(String)

假设上述输出,两个函数中的错误很少 getImage1() - >

  • 在第二次替换中,您需要使用第一个替换输出的image1变量。
  • 您需要替换“_highlighted”而不是“_highlight”

getImage2() - >

  • 如果您需要搜索“_”,请使用indexOf函数。
  • 您需要替换“突出显示”而不是“突出显示”

我修改了以下功能,提供了所需的输出

private static String getImage1(final String image) {
    return image.replace("_highlighted", "").replace("_selected", "");
}
private static String getImage2(final String image) {
    if (image.indexOf("_")!=-1) {
        return image.replace("highlighted", "selected");
    } else {
        return image.replace(".", "_selected.");
    }
}

答案 2 :(得分:0)

首先,getImage1()可能没有按照您的意愿执行操作。您要为变量image1赋值3次。显然,返回了最后一个赋值。

其次,image2.matches("_")告诉您image2是否包含下划线(我认为这是您在此处尝试做的事情)。

我建议先自己做一些测试/调试。

答案 3 :(得分:0)

1

private String getImage1(final String image) {
  return image.replaceAll("_(highlighted|selected)", "");
}

2

private String getImage2(final String image) {
  return image.replaceAll(getImage1(image).replaceAll("(?=.gif)", "_selected");
}