Java中的字符串模式匹配

21
我想在输入的字符串中搜索给定的字符串模式。
例如。
String URL = "https://localhost:8080/sbs/01.00/sip/dreamworks/v/01.00/cui/print/$fwVer/{$fwVer}/$lang/en/$model/{$model}/$region/us/$imageBg/{$imageBg}/$imageH/{$imageH}/$imageSz/{$imageSz}/$imageW/{$imageW}/movie/Kung_Fu_Panda_two/categories/3D_Pix/item/{item}/_back/2?$uniqueID={$uniqueID}"

现在我需要搜索字符串URL是否包含“/{item}/”。请帮忙。

这是一个示例。实际上我需要检查URL是否包含与“/{a-zA-Z0-9}/”匹配的字符串。

4个回答

40
您可以使用Pattern类来实现这一点。如果您只想匹配{}内部的单词字符,则可以使用以下正则表达式。\w[a-zA-Z0-9_]的速记符号。如果您接受_,则使用\w,否则使用[a-zA-Z0-9]
String URL = "https://localhost:8080/sbs/01.00/sip/dreamworks/v/01.00/cui/print/$fwVer/{$fwVer}/$lang/en/$model/{$model}/$region/us/$imageBg/{$imageBg}/$imageH/{$imageH}/$imageSz/{$imageSz}/$imageW/{$imageW}/movie/Kung_Fu_Panda_two/categories/3D_Pix/item/{item}/_back/2?$uniqueID={$uniqueID}";
Pattern pattern = Pattern.compile("/\\{\\w+\\}/");
Matcher matcher = pattern.matcher(URL);
if (matcher.find()) {
    System.out.println(matcher.group(0)); //prints /{item}/
} else {
    System.out.println("Match not found");
}

当使用 \w+ 时,加号 + 的作用是什么? - COLD ICE
@COLDICE + 是一个量词,表示一次或多次。 - Narendra Yadala

14

这只是使用String.contains的问题:

if (input.contains("{item}"))

如果你需要知道它发生的位置,你可以使用 indexOf

int index = input.indexOf("{item}");
if (index != -1) // -1 means "not found"
{
    ...
}

如果你只需要匹配完全相同的字符串,那么这样做就可以了。但是,如果你需要真正的模式匹配(例如,“三个数字后面跟着最多两个字母A-C”),那么你应该研究一下正则表达式

编辑:好的,听起来你确实需要正则表达式。你可能需要像这样的东西:

private static final Pattern URL_PATTERN =
    Pattern.compile("/\\{[a-zA-Z0-9]+\\}/");

...

if (URL_PATTERN.matcher(input).find())

1
@1355:好的,这完全改变了问题的性质...但是你的意思并不是很清楚。请举一些你想匹配和不想匹配的URL示例。它是“任意数量的字母/数字,但它们必须在大括号中”吗? - Jon Skeet
.matcher()。不是.matches() - Det
@Det:已修复 - 以后可以直接编辑错别字。 - Jon Skeet
讽刺的是,看起来我最初是对的,而另一个用户在修复一个不相关的真正问题时“更正”为matches() - Jon Skeet
@JonSkeet 我不知道。我只是不喜欢编辑别人的东西。 - Det
显示剩余3条评论

4
如果您想检查一个字符串是否在另一个字符串中出现,可以使用类似于String.contains的方法。
如果您想检查某个模式是否在字符串中存在,请在模式前后添加'.*'。结果将接受包含该模式的字符串。
例如:假设您有一些正则表达式a(b|c),用于检查字符串是否匹配abac
.*(a(b|c)).* 将检查字符串是否包含abac
这种方法的缺点是它不会给出匹配位置,如果您需要匹配位置,可以使用java.util.Mather.find()。

2
您可以使用 string.indexOf("{item}") 来实现。如果结果大于-1,则表示字符串中包含{item}

感谢您的及时回复。现在我已经编辑了问题。您能帮我吗? - skmaran.nr.iras
1
Jon已经完成了,所以没有必要重复他的工作。您需要Pattern,可选的是Matcher - zeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接