正则表达式从created关键字替换为next&

时间:2015-02-02 20:23:12

标签: java regex

我不是没有任何代码的问题的朋友,但我完全不知道如何搜索这个问题。

我有一个像这样的字符串,带有几个键/值对: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可以是testtest2test3。 =后面的值可以是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);
}

4 个答案:

答案 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); 

由于nametest2,因此正则表达式将显示为\btest2=\d+

  • \bword 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)

创建一个看起来像的新字符串 lTest "\n" lUpdate
然后使用这种模式

^([^=]+)=(\d+)\n(.*?)\1=\d+  

并替换w /

$3$1=$2  

Demo

答案 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 );
}