找出正则表达式匹配的内容。*

时间:2015-01-28 16:46:00

标签: java regex

嘿伙计们我有一个新问题。

我有一个动态创建的String,它包含一个占位符!fruit!。然后我想找到任何与此String匹配的字符串。因此,我会做以下事情:

String s = "A Basket of !fruit! was lost";
String toCompare "A Basket of Apples was lost";
if (toCompare.match(s.replace("!fruit!", ".*"))) //Yes everycharacter is a Fruit :-P 
   //do something

我现在想知道。*匹配的是什么(在这种情况下" Apples")我对如何解决这个问题毫无头绪......

2 个答案:

答案 0 :(得分:2)

首先,您需要使用正则表达式来定义捕获组,该组使用括号:s.replace("!fruit!", "(.*)")完成。

然后,您需要使用PatternMatcher,而不仅仅是普通String.match

Pattern pattern = Pattern.compile(s.replace("!fruit!", "(.*)"));
Matcher m = pattern.matcher(toCompare);
if (m.matches()) {
  String fruit = m.group(1);
}

为了更加健壮,您还应该注意s字符串本身具有“特殊”正则表达式字符,或者不包含“!fruit!”一点都不。

例如,如果s = "Was a basket (or something) of !fruit! lost?"怎么办?在这种情况下,第一个匹配组将为(or something),括号将不会匹配(因为它们是正则表达式中的特殊字符),?将影响t而不是匹配问号。这将匹配:

toCompare = "Was a basket or something of apples los";

... matcher.group(1)"or something",而不是"apples"(将在matcher.group(2)中)。

解决这个问题通常会有点困难。您基本上应该在!fruit!上拆分字符串,在每一侧使用Pattern.quote,然后拼接"(.*)"。 (Pattern.quote接受一个字符串并返回一个字符串,当被视为正则表达式时,将字面上匹配第一个字符串。例如,传入"foo?"将返回“foo \?”。)< / p>

String[] splits = s.split("!fruit!");
if (splits.length != 2) {
    throw new IllegalArgumentException("no '!fruit!' specified");
}
Pattern pattern = Pattern.compile(
    Pattern.quote(splits[0]) +  "(.*)" + Pattern.quote(splits[1]));
...

答案 1 :(得分:2)

您可以将其设为捕获组((.*)),并使用Pattern API从找到的匹配项中获取该组:

    String s = "A Basket of !fruit! was lost";
    String toCompare = "A Basket of Apples was lost";
    Pattern pattern = Pattern.compile(s.replace("!fruit!", "(.*)"));
    Matcher matcher = pattern.matcher(toCompare);
    if (matcher.find()) {
        System.out.println(matcher.group(1));
    }