Java正则表达式匹配

时间:2010-07-09 13:16:59

标签: java regex

强文我在文本文件中有很多行,我希望与${ALPANUMERIC characters}匹配,并将其替换为${SAME ALPHANUMERIC characters plus _SOMETEXT(CONSTANT)}

我已经尝试过这个表达式${(.+)}但它没有用,我也不知道如何在java中替换正则表达式。

感谢您的反馈

以下是我的一些代码:

BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        StringBuilder sb = new StringBuilder();

        while ((line = br.readLine()) != null) {
            Pattern p = Pattern.compile("\\$\\{.+\\}");
            Matcher m = p.matcher(line); // get a matcher object
               if(m.find()) {
                   System.out.println("MATCH: "+m.group());
                   //TODO
                   //REPLACE STRING
                   //THEN APPEND String Builder
               }
            }               

确定以上情况有效,但它只找到我的变量,而不是前面的整行是我的输入:

${VARIABLE_NAME}之前的一些文字 在${VARIABLE_NAME2}之前的一些文字之后的一些文字 在一些文本之前的一些文本没有变量之后的一些文本 ......等等

所以我只想将${VARIABLE_NAME}${VARIABLE_NAME}替换为${VARIABLE_NAME2_SOMETHING},但保留前后文本行

编辑:

我虽然有这样的方式:

if(line.contains("\\${([a-zA-Z0-9 ]+)}")){
                    System.out.println(line);
                }

if(line.contains("\\$\\{.+\\}")){
                    System.out.println(line);
                }

我的想法是捕获包含它的行,然后替换,但正则表达式不正常,但它适用于模式/匹配器组合。

编辑II

我觉得我在这里越来越接近解决方案,这是我到目前为止所提出的:

  if(line.contains("$")){
                    System.out.println(line.replaceAll("\\$\\{.+\\}", "$1" +"_SUFFIX"));
                }

我在$1的意思是你刚刚匹配的字符串替换它自己+ _SUFFIX

4 个答案:

答案 0 :(得分:1)

$是一个特殊的正则表达式字符,表示一行的结尾。你需要逃脱它以匹配它。由于Java处理字符串的方式,您还需要转义用于转义美元符号的反斜杠。

将文字放入字符串后,您应该可以执行以下操作:

str.replaceAll("\\${([a-zA-Z0-9 ]+)}", "\\${$1 _SOMETEXT(CONSTANT)}")

如果变量名中有其他字符(即下划线,符号等等),则只需将它们添加到您要匹配的字符类中。

修改:如果您想使用PatternMatcher,则仍有一些更改。首先,您可能希望在循环之外编译Pattern。其次,你可以使用它,虽然它更详细。

Pattern p = Pattern.compile("\\$\\{.+\\}");
Matcher m = p.matcher(line);
sb.append(m.replaceAll("\\${$1 _SOMETEXT(CONSTANT)}"));

答案 1 :(得分:1)

我会使用String.replaceAll()方法,如下所示:

`String old =“一些字符串数据”;

String new = old.replaceAll(“$([a-zA-Z0-9] +)”,“(\ 1)CONSTANT”); `

答案 2 :(得分:1)

解决方案:

while ((line = br.readLine()) != null) {

                if(line.contains("$")){ 
                    sb.append(line.replaceAll("\\$\\{(.+)\\}", "\\${$1" +"_SUFFIX}") + "\n");
                }else{
                    sb.append(line + "\n");
                }

            }   

答案 3 :(得分:1)

line = line.replaceAll("\\$\\{\\w+", "$0_SOMETHING");

无需检查是否存在$或其他内容;这是replaceAll()所做的一部分。无论如何,contains()不像find()那样是正则表达式的;它只是进行简单的文字文本搜索。