我必须在testFile.xml中搜索每个单词"abc"+ 7个不重要的数字+"myOldWord"来更改为一些新内容而不用担心里面的数字.会有几个"xxx9999999myOldWorld".如何找到"abc1234567myOldWorld"并使用正则表达式替换newWorld的myOldWorld?我不仅可以从myOldWorld交换到newWord,因为必须在搜索条件中使用前三个字符,必须忽略它们之间的未知7长度.
其他例子.让我们说我有新的世界"aaaOtherNewWord"来取代"aaa9999999OtherOldWord"(我不知道搜索时的数字,并且有几个不同的数字).假设testFile.xml中有三个旧单词:aaa1234567OTHEROLDWORD,aaa9876543otheroldword和bbb9876543otheroldword,我想执行replaceAll并得到结果:aaa1234567OtherNewWord和aaa9876543OtherNewWord尊重但是bbb9876543otheroldword不会改变,因为前3位数字与搜索条件不匹配.
我在下面编码成功,我在搜索时忽略了这个案例,但我必须忽略这些数字,我不知道如何用正则表达式做到这一点.
Path path = Paths.get("C:\\testFolder\\testFile.xml");
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("(?i)" + oldWord, newWord);
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是Java 8.
整个测试是:
// C:\ test.xml
<?xml version="1.0" encoding="UTF-8"?>
<c:bps xmlns:c="CertainApp">
<c:bp name="ProductPortfolio" id="myProdPort">
<!-- must result in ABC1234567MyCompanyWORDProductSubproduct-->
<c:message type="ABC1234567MyCompanyWorDProductSubproduct" />
<!-- must result in ABC0987654MyCompanyWORDProductSubproduct-->
<c:message type="ABC0987654MyCompanyWoRdProductSubproduct" />
<!-- must result in XYZ1234567MyCompanywordproductSubproduct-->
<c:message type="XYZ1234567MyCompanywOrdproductSubproduct" />
<!-- nothing changed in next two-->
<c:message type="XYZ1234567MyCompanyAnyThingproductSubproduct" />
<c:message type="XYZ0987654MyCompanyAnyThingproductSubproduct" />
</c:bps>
Run Code Online (Sandbox Code Playgroud)
// C:\ defaults_test包含两个文件
ABCMyCompanyWORDproductSubproduct.xml //here the “word” is uppercase and starts with ABC
XYZMyCompanywordproductSubproduct.xml //here the “word” is lowercase and starts with XYZ
public class ReadICTTDefaultFolder {
public static void replaceFileString(String first3letters, String word) {
Path path = Paths.get("C:\\test.xml");
Charset charset = StandardCharsets.UTF_8;
try{
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("((?i)" + first3letters + "\\d{7})" + word, "$1"+word);
Files.write(path, content.getBytes(charset));
}
catch(Exception e){
}
}
public static void main(String[] args) {
File actual = new File("C:\\ defaults_test");
File list[] = actual.listFiles();
for(int i=0; i<list.length; i++){
String substring = list[i].getName().substring(0, list[i].getName().indexOf("."));
if(list[i].isFile() && substring.toUpperCase().contains("WORD")){
replaceFileString(substring.substring(0,3), substring.substring(3));
}
}
}
Run Code Online (Sandbox Code Playgroud)
content = content.replaceAll("(abc\\d{7})" + oldWord, "$1"+newWord);
Run Code Online (Sandbox Code Playgroud)
您可以在替换字符串,通过指一组$n,其中n是组号.
正则表达式部分\\d{7}恰好匹配七位数(不要将其与数字混淆).
也可以使用正向lookbehind断言选择正确的oldWord:
replaceAll( "(?<=abc\\d{7})" + oldWord, newWord )
Run Code Online (Sandbox Code Playgroud)
然后你不需要1美元.
后来
现在我看到整个混乱,"(?i)"是必不可少的,我应该补充一个选项字符串必须写在括号的正确嵌套级别:
...replaceAll("(?i)(" + prefix + "\\d{7})" + oldWord, "$1"+newWord);
Run Code Online (Sandbox Code Playgroud)
而不是
...replaceAll("((?i)" + prefix + "\\d{7})" + oldWord, "$1"+newWord);
Run Code Online (Sandbox Code Playgroud)
这将限制案例忽略匹配前缀.由于前缀应该或许完全匹配,因此最好写
...replaceAll("(" + prefix + "\\d{7})(?i)" + oldWord, "$1"+newWord);
Run Code Online (Sandbox Code Playgroud)
看来,oldWord和newWord是相同的,除了大小写,你也可以使用
...replaceAll("(" + prefix + "\\d{7})(?i)" + word, "$1" + word);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |