我有一个ArrayMap
,其中keys
类似于tag - randomWord
。我想检查密钥的tag
部分是否与某个变量匹配。
我曾尝试弄乱Patterns
,但没有成功。我现在唯一能让这个工作的方法就是遍历for
循环中的所有键,然后在' - '
上拆分键,并从中获取第一个值,与我的相比较变量
for (String s : testArray) {
if ((s.split("(\\s)(-)(\\s)(.*)")[0]).equals(variableA)) {
// Do stuff
}
}
这对我来说似乎非常狡猾,特别是因为我只需要知道keySet
是否包含变量,这是我感兴趣的所有内容。我我正在考虑使用contains()
方法,然后输入(variableA + "(\\s)(-)(\\s)(.*)")
,但这似乎不起作用。
有没有办法在这种情况下使用.contains()
方法,还是我必须手动循环键?
答案 0 :(得分:1)
您应该将这些任务分成两个步骤 - 首先提取标记,然后进行比较。您的代码应如下所示:
for (String s : testArray) {
if (arrayMap. keySet().contains(extractTag(s)) {
// Do stuff
}
}
请注意,我们已将我们的问题分为两个步骤,以便更轻松地验证每个步骤的行为是否正确。所以现在的问题是"我们如何实施extractTag()
?"
正则表达式中的( )
符号会创建group match,您可以通过Matcher.group()
检索该代码 - 如果您只关心tag
,则可以使用{{1}像这样:
Pattern
在这种情况下,您的"(\\S+)\\s-\\s.*"
方法如下:
extractTag()
如果您更喜欢使用private static final Pattern TAG_PATTERN = Pattern.compile("(\\S+)\\s-\\s.*");
private static String extractTag(String s) {
Matcher m = TAG_PATTERN.matcher(s);
if (m.matches()) {
return m.group(1);
}
throw new IllegalArgumentException(
"'" + s + "' didn't match " TAG_PATTERN.pattern());
}
,则只需要定义与分隔符匹配的正则表达式,在本例中为String.split()
;您可以在-
调用中使用以下正则表达式:
split()
在"\\s-\\s"
之后使用+
来支持一个或多个空格通常是个好主意,但这取决于您需要处理哪些输入。如果你知道它总是完全是一个空格跟随一个破折号后跟一个空格,你可以分开:
\\s
在这种情况下,您的" - "
方法如下:
extractTag()