Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式匹配_Java_Regex - Fatal编程技术网

Java正则表达式匹配

Java正则表达式匹配,java,regex,Java,Regex,strong text我在一个文本文件中有一大堆行,我想匹配这个${ALPANUMERIC characters},并用${相同的字母数字字符加上_SOMETEXT(常量)}替换它 我尝试过这个表达式${(+)},但它不起作用,我也不知道如何在java中执行replace regex 感谢您的反馈 以下是我的一些代码: BufferedReader br = new BufferedReader(new FileReader(file)); String line;

strong text我在一个文本文件中有一大堆行,我想匹配这个
${ALPANUMERIC characters}
,并用
${相同的字母数字字符加上_SOMETEXT(常量)}
替换它

我尝试过这个表达式
${(+)}
,但它不起作用,我也不知道如何在java中执行replace regex

感谢您的反馈

以下是我的一些代码:

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
               }
            }               
好的,上面的操作正常,但它只找到我的变量,而不是ex的整行。这里是我的输入:

${VARIABLE\u NAME}前面的一些文本
后面的一些文本
${VARIABLE\u NAME2}之前的一些文本
之后的一些文本
某些文本之前的某些文本不带变量,某些文本之后的某些文本
... etc

因此,我只想将
${VARIABLE\u NAME}
${VARIABLE\u NAME}
替换为
${VARIABLE\u NAME2\u 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
是指您刚刚匹配的字符串,将其替换为自身+\u后缀该
$
是一个表示行尾的特殊正则表达式字符。你需要逃离它才能匹配它。由于Java处理字符串的方式,您还需要转义用于转义美元符号的反斜杠

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

str.replaceAll("\\${([a-zA-Z0-9 ]+)}", "\\${$1 _SOMETEXT(CONSTANT)}")
如果变量名中有其他字符(即下划线、符号等),则只需将它们添加到要匹配的字符类中即可

编辑:如果要使用
模式
匹配器
,则仍有一些更改。首先,您可能希望在循环之外编译您的模式。第二,您可以使用它,尽管它更详细

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

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

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

str.replaceAll("\\${([a-zA-Z0-9 ]+)}", "\\${$1 _SOMETEXT(CONSTANT)}")
如果变量名中有其他字符(即下划线、符号等),则只需将它们添加到要匹配的字符类中即可

编辑:如果要使用
模式
匹配器
,则仍有一些更改。首先,您可能希望在循环之外编译您的模式。第二,您可以使用它,尽管它更详细

Pattern p = Pattern.compile("\\$\\{.+\\}");
Matcher m = p.matcher(line);
sb.append(m.replaceAll("\\${$1 _SOMETEXT(CONSTANT)}"));
我会使用这样的方法:

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

字符串new=old.replaceAll(“$([a-zA-Z0-9]+)”,“(\1)常量”)`

我会使用这样的方法:

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

字符串new=old.replaceAll(“$([a-zA-Z0-9]+)”,“(\1)常量”)`

解决方案:

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

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

            }   
解决方案:

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

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

            }   
无需检查是否存在
$
或任何内容;这是
replaceAll()
的一部分功能。无论如何,
contains()
不像
find()
那样使用正则表达式;它只是执行纯文本搜索

无需检查是否存在
$
或任何内容;这是
replaceAll()
的一部分功能。无论如何,
contains()
不像
find()
那样使用正则表达式;它只是执行纯文本搜索