嘿伙计们我有一个新问题。
我有一个动态创建的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")我对如何解决这个问题毫无头绪......
答案 0 :(得分:2)
首先,您需要使用正则表达式来定义捕获组,该组使用括号:s.replace("!fruit!", "(.*)")
完成。
然后,您需要使用Pattern
和Matcher
,而不仅仅是普通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));
}