我有一个ArrayMap
,其中的键
类似于标签 - randomWord
。我想检查键的 tag
部分是否与某个变量匹配。
我尝试过使用Patterns
,但没有成功。目前我可以让它工作的唯一方法是迭代 for
循环中的所有键,然后在 ' - '
上拆分键,并获取第一个值,与我的变量进行比较。
for (String s : testArray) {
if ((s.split("(\\s)(-)(\\s)(.*)")[0]).equals(variableA)) {
// Do stuff
}
}
这对我来说似乎非常狡猾,特别是因为我只需要知道keySet
包含变量,这就是我感兴趣的。我在想使用 contains()
方法,并放入 (variableA + "(\\s)(-)(\\s)(.*)")
,但是似乎不起作用。
对于这种情况,有没有办法使用 .contains()
方法,或者我是否必须手动循环键?
最佳答案
您应该将这些任务分为两个步骤 - 首先提取标签,然后进行比较。您的代码应如下所示:
for (String s : testArray) {
if (arrayMap. keySet().contains(extractTag(s)) {
// Do stuff
}
}
请注意,我们已将我们的关注点分为两个步骤,以便更轻松地单独验证每个步骤是否正确运行。所以现在的问题是“我们如何实现 extractTag()
?”
正则表达式中的 ( )
符号创建 group match ,您可以通过Matcher.group()
检索- 如果您只关心标签
,您可以使用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()
方法将如下所示:
private static String extractTag(String s) {
String[] parts = s.split(" - ");
if (parts.length > 1) {
return s[0];
}
throw new IllegalArgumentException("Could not extract tag from '" + s + "'");
}
关于java - 如何检查 ArrayMap.keySet() 是否包含某个变量+正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943544/