我不是没有任何代码的问题的朋友,但我完全不知道如何搜索这个问题。
我有一个像这样的字符串,带有几个键/值对:test=39&test2=4&test3=10
和更新字符串,如test2=5
现在我想用String.replaceAll
方法调用一个表达式,用test2=5
替换上面的字符串,这样我得到test=39&test2=5&test3=10
String lTest = "test=39&test2=4&test3=10";
String lUpdate = "test2=5";
Assert.assertEquals("test=39&test2=5&test3=10",lTest.replace(lTest,???regex???);
lUpdate
可以是test
或test2
或test3
。 =后面的值可以是0到1000之间的数字。
如何使用正则表达式来管理它?
非常感谢你的帮助。
UPDATE !!! 这就像一个魅力(对用户laune来说):
@Test
public void test(){
String lResult = update("test1=1234&test2=4949&test3=1", "test2=42");
assertEquals("test1=1234&test2=42&test3=1", lResult);
lResult = update("test1=1234&test2=4949&test3=1", "test3=5");
assertEquals("test1=1234&test2=4949&test3=5", lResult);
lResult = update("test1=1234&test2=4949&test3=1", "test1=100");
assertEquals("test1=100&test2=4949&test3=1", lResult);
}
static String update(String str, String upd) {
// split to get the keyword and the value
String[] kwv = upd.split("=");
// compose the regex
String regex = "(?<=^|&)" + Pattern.quote(kwv[0]) + "=\\d+";
return str.replaceAll(regex, upd);
}
答案 0 :(得分:1)
这样的事情
String lTest = "test=39&test2=4&test3=10";
String lUpdate = "test2=5";
String name = lUpdate.split("=")[0]; //test2
lTest = lTest.replaceAll("\\b"+name+"=\\d+", lUpdate);
由于name
为test2
,因此正则表达式将显示为\btest2=\d+
。
\b
为word boundary,这会阻止正则表达式引擎匹配test2
中的Footest2
\d+
代表一个或多个数字,因此它应该能够匹配问题中指出的0-1000范围内的数字。如果name
对中的name=value
可能包含某些特殊字符,例如+
或%
,也可能是正则表达式,则应该将它们排除在外。最简单的方法是使用Pattern.quote(name)
此外,%
这样的非字母字符(或数字)也会破坏带有字边界\b
的方法,因为\btest2
也可以与foo%test2
匹配,因为%
不被视为name
作为单词字符。在这种情况下,我们需要更精确的测试来检查&
字符或start of the string(^
)之后是否放置了(?<=&|^)
。换句话说,我们需要使用look-behind lTest = lTest.replaceAll("(?<=&|^)"+Pattern.quote(name)+"=\\d+", lUpdate);
所以你的代码可以是
{{1}}
答案 1 :(得分:1)
答案 2 :(得分:1)
首先,您必须将lUpdate
字符串细分为变量名称和值,以便在lTest
中搜索变量名称:
String lTest = "test=39&test2=4&test3=10";
String lUpdate = "test2=5";
Matcher assignmentMatcher = Pattern.compile("(.*)=(.*)").matcher(lUpdate);
if (assignmentMatcher.matches()) {
String varName = assignmentMatcher.group(1);
String val = assignmentMatcher.group(2);
String replaced = lTest.replaceFirst(varName + "=[^&]+", varName + "=" + val);
Assert.assertEquals("test=39&test2=5&test3=10",replaced);
}
答案 3 :(得分:1)
应该使用更新字符串构造正则表达式。我使用负面的lookbehind,所以即使是带有嵌入连字符的关键字也可以使用。
static String update( String str, String upd ){
// split to get the keyword and the value
String[] kwv = upd.split( "=" );
// compose the regex
String regex = "(?<=^|&)" + Pattern.quote(kwv[0]) + "=\\d+";
return str.replaceAll( regex, upd );
}