Java正则表达式字符串匹配

时间:2015-02-25 14:05:47

标签: java regex

我需要帮助。我正在编写一个方法,如果1954在字符串images/deal/129277/1954-bonus.jpg中,它将返回true。我可以使用string.contains但它总是不准确。相反,如果1954年处于确切位置,我希望它返回true。 sourceKey下面是images/deal/129277/1954-bonus.jpg,oldImageId是1954

下面的代码不起作用。

private boolean keyMatches(String sourceKey, String oldImageId){
    Pattern pattern = Pattern.compile("(.*?)/(\\d+)/(\\d+)-(.*)");
    Matcher matcher = pattern.matcher(sourceKey);
    return oldImageId.equals(matcher.group(3));
}

4 个答案:

答案 0 :(得分:2)

好像你想要这样的东西,

String s = "images/deal/129277/1954-bonus.jpg";
String oldImageId = "1954";
Matcher m = Pattern.compile("(.*?)/(\\d+)/(\\d+)-(.*)").matcher(s);
if(m.find())
{
System.out.println(oldImageId.matches(m.group(3)));
}

输出:

true

答案 1 :(得分:1)

尝试这样的事情:

public static void main(String[] args) {
    String s = "images/deal/129277/1954-bonus.jpg";
    String s1 = "images/deal/1954/1911254-bonus.jpg";
    System.out.println(s.matches(".*/1954\\-.*"));
    System.out.println(s1.matches(".*/1954\\-.*"));
}

O / P:

true
false

答案 2 :(得分:0)

我的代码中至少有一个错误。除非您之前调用find()match()方法并且这些方法返回true,否则匹配器不会返回任何组。

因此,您的代码应修改如下:

Matcher matcher = pattern.matcher(sourceKey);
return matcher.find() ? oldImageId.equals(matcher.group(3)) : null;

我留给你验证你的正则表达式确实是正确的。

答案 3 :(得分:0)

使用正则表达式预测和String#matches()您的函数可以像

一样
private boolean keyMatches(String sourceKey, String oldImageId){
    return sourceKey.matches(".*/(?!.*/)"+oldImageId+"-.*");
}

我尝试使用放置在网址各个部分的1954进行以下测试,以试图欺骗正则表达式。

System.out.println(keyMatches("images/deal/129277/1954-bonus.jpg", "1954"));
System.out.println(keyMatches("images/deal/1954-pics/129277-bonus.jpg", "1954"));
System.out.println(keyMatches("123-1954/1954-00/1954/129277-bonus.jpg", "1954"));
System.out.println(keyMatches("images/deal/129277/129277-1954-bonus.jpg", "1954"));

输出:

true
false
false
false