我有一个字符串:
String s = "a=xxx|b = yyy|c= zzz"
我正在尝试编写一个返回与给定键对应的值的函数,但它不能按预期工作(它返回一个空字符串):
static String getValueFromKey(String s, String key) {
return s.replaceAll(key + "\\s*=\\s*(.*?)(\\|)?.*", "$1");
}
测试:
static void test() {
String s = "a=xxx|b = yyy|c= zzz";
assertEquals(getValueFromKey(s, "a"), "xxx");
assertEquals(getValueFromKey(s, "b"), "yyy");
assertEquals(getValueFromKey(s, "c"), "zzz");
}
我需要通过测试的正则表达式是什么?
答案 0 :(得分:2)
如果你有这些字符串,你可以使用这样的简单正则表达式:
X\s*=\s*(\w*)
<强> Working demo 强>
正如 Michelle 在他的评论中所指出的,如果您将苹果和菠萝作为键,那么您可以使用字边界来避免遇到麻烦:
\bapple\b\s*=\s*(\w*)
<强> Working demo 强>
答案 1 :(得分:2)
您可以将此正则表达式用于匹配:
\W*(\w+)\W*=\W*([^|]*)
<强>代码:强>
static void test() {
String s = "a=xxx|b = yyy|c= zzz";
Pattern pattern = Pattern.compile("\\W*(\\w+)\\W*=\\W*([^|]*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1) + " :: " + matcher.group(2));
}
}
}
<强>输出:强>
a :: xxx
b :: yyy
c :: zzz
答案 2 :(得分:2)
根据问题,您似乎只想更改正则表达式并保持相同的代码结构。因此,您必须确保正则表达式匹配完整模式,否则该字符串仍将包含其他数据。因此,即使有更好的方法来实现这一点,答案是:
s.replaceAll(".*?\\b" + key + "\\s*=\\s*(.*?)($|\\|.*)", "$1");
您可以对其进行测试here。
答案 3 :(得分:2)
在这里使用replaceAll
似乎有点矫枉过正,因为这种方法必须迭代整个String。相反,您可以使用匹配及其find
方法,该方法将在匹配搜索的正则表达式(在情况key=value
对中)后停止。
所以也许可以使用类似的东西:
static String getValueFromKey(String s, String key) {
Matcher m = Pattern.compile(
"(?<=^|\\|)\\s*" + Pattern.quote(key) + "\\b\\s*=\\s*(?<value>[^|]*)")
.matcher(s);
if (m.find())
return m.group("value");
else
return null;// or maybe return empty String "" but that may be misleading
// for values which are really empty Strings
}
答案 4 :(得分:0)
如果没有正则表达式,这很容易做到:
static String getValueFromKey(String s, String key) {
string[] pairs = s.split("|");
for (String p : pairs) {
string[] halves = p.split("=");
if (halves[0].equals(key)) {
return halves[1];
}
}
return "";
}
此代码字将String
s
分为&#39; |&#39; charachter,创建一个形式为String
的数组&#34; key = value&#34;。然后它会在&#39; =&#39;上拆分这些键值对中的每一个。字符,直到找到key
,并返回相关值。
是否有特定原因需要使用正则表达式而不是像这样的方法?