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