在动态字符串中形成正确的正则表达

时间:2011-11-25 14:20:24

标签: java regex

我有一个FileInputStream,它读取的文件某处包含一个字符串子集,如下所示:

...
    OperatorSpecific(XXX)
    {
       Customer(someContent)
       SaveImage()
       {
...

我想识别字符串的Customer(someContent)部分,并将括号内的someContent切换为其他内容。

someContent将是一个动态参数,将包含一个可能包含5-10个字符的字符串。

我之前使用过regEx,比如一次或两次,但我觉得在这样的上下文中,我不知道括号内会有什么价值,我不知道应该如何表达它。 ..

总之,我希望有一个返回给我的字符串,它在Customer-parenthesis中有myContent值。

有没有人对如何完成这项工作有任何明智的想法?

3 个答案:

答案 0 :(得分:1)

试试这个(在java中使用转义反斜杠的两倍!)

(?<=Customer\()[^\)]*

并替换您的内容。

here at Regexr

(?<=Customer\()看起来是断言。它检查每个位置是否有“客户(”左侧,如果是,它匹配右侧所有非“a”的字符“)与[^\)]*,则这是将被替换的部分

一些有效的java代码

Pattern p = Pattern.compile("(?<=Customer\\()[^\\)]*");
String original = "Customer(someContent)";
String Replacement = "NewContent";

Matcher m = p.matcher(original);
String result = m.replaceAll(Replacement);

System.out.println(result);

这将打印

  

客户(NewContent)

答案 1 :(得分:0)

未经测试,但以下内容应该有效:

Pattern pattern = Pattern.compile("\\s+Customer\\(\\s*(\\w+)\\s*\\)\\s*");
Matcher matcher = pattern.matcher(input);
matcher.matches();

System.out.println(matcher.group(1));

修改

这当然不适用于所有可能的情况:

// legal variable names
Customer(_someContent)
Customer($some_Content)

答案 2 :(得分:0)

使用群组作品和非贪婪作品:

String s = 
    "OperatorSpecific(XXX)\n    {\n" +
    "       Customer(someContent)\n" +
    "       SaveImage()       {";
Pattern p = Pattern.compile("Customer\\((.*?)\\)");
Matcher matcher = p.matcher(s);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

将打印

someContent