使用 Java replace() 从 WMIC 输出中删除不需要的字符
Remove unwanted character from WMIC output using Java replace()
我目前正在研究系统配置检查器。为此,我需要检索被测机器的操作系统并针对 .csv
文件对其进行测试。
不幸的是,在测试时,一台机器让我非常头疼:从 WMI 命令检索字符串后,ÿ
字符插入到 space 应该插入的位置。结果,我的字符串比较是错误的,而实际上它不应该。这是一个小代码块,可以帮助您理解该过程:
//The command to execute
String masterCommand = "wmic os get ";
String command = "Caption";
//The process that executes the command
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", masterCommand + command);
Process p = pb.start();
p.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
//The command result stored in a string
while((line = br.readLine()) != null) {
result += line;
}
//The string cleaned of unwanted substring and trailing spaces
result = result.replace(command, "").trim();
预期结果是 Microsoft Windows 10 Enterprise
但最终结果是 Microsoft Windowsÿ10 Enterprise
我认为使用Java的replace()
方法可以解决问题,但没有任何作用。这是我目前正在使用的替换。
result = result.replace("(?i)windows.", "Windows ");
我应该补充一点,命令 (wmic os get Caption
) 在 cmd 上输出正确的结果,而且似乎也正确地将其输出到 .txt
文件。
TL;DR
我使用 ProcessBuilder
在 Java 中使用 wmic 并得到了 replace()
未检测到的不需要的字符 (ÿ
)。
我该怎么做才能得到正确的结果(避免写入文件然后读取它)?
请指出任何需要澄清或纠正的地方。
提前感谢您的回答。
你试过吗?
String result = "Microsoft Windowsÿ10 Enterprise";
result = result.replace('ÿ', ' ');
System.out.println(result); //prints Microsoft Windows 10 Enterprise
我找到了一个有点笨拙但对我有用的解决方案。
因为不需要的字符是 Unicode 字符,所以我只保留 ASCII 字符来清理字符串。
result = result.replaceAll("[^ -~]", "").trim().replaceAll(" +", " ");
result = result.replace("(?i)windows[^ ]", "Windows ");
它的作用是获取 result
字符串并替换为空字符串(""
空字符串)所有值在 </code> 之外的字符(白色space) 到 <code>~
范围 (printable ASCII).
附加代码简单地修剪所有 spaces 并将 2+ spaces 替换为一个。
最后一行处理 "Windows" 及其版本(例如 7、XP、Vista 等)之间的潜在可打印 ASCII 字符。
我目前正在研究系统配置检查器。为此,我需要检索被测机器的操作系统并针对 .csv
文件对其进行测试。
不幸的是,在测试时,一台机器让我非常头疼:从 WMI 命令检索字符串后,ÿ
字符插入到 space 应该插入的位置。结果,我的字符串比较是错误的,而实际上它不应该。这是一个小代码块,可以帮助您理解该过程:
//The command to execute
String masterCommand = "wmic os get ";
String command = "Caption";
//The process that executes the command
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", masterCommand + command);
Process p = pb.start();
p.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
//The command result stored in a string
while((line = br.readLine()) != null) {
result += line;
}
//The string cleaned of unwanted substring and trailing spaces
result = result.replace(command, "").trim();
预期结果是 Microsoft Windows 10 Enterprise
但最终结果是 Microsoft Windowsÿ10 Enterprise
我认为使用Java的replace()
方法可以解决问题,但没有任何作用。这是我目前正在使用的替换。
result = result.replace("(?i)windows.", "Windows ");
我应该补充一点,命令 (wmic os get Caption
) 在 cmd 上输出正确的结果,而且似乎也正确地将其输出到 .txt
文件。
TL;DR
我使用 ProcessBuilder
在 Java 中使用 wmic 并得到了 replace()
未检测到的不需要的字符 (ÿ
)。
我该怎么做才能得到正确的结果(避免写入文件然后读取它)?
请指出任何需要澄清或纠正的地方。
提前感谢您的回答。
你试过吗?
String result = "Microsoft Windowsÿ10 Enterprise";
result = result.replace('ÿ', ' ');
System.out.println(result); //prints Microsoft Windows 10 Enterprise
我找到了一个有点笨拙但对我有用的解决方案。
因为不需要的字符是 Unicode 字符,所以我只保留 ASCII 字符来清理字符串。
result = result.replaceAll("[^ -~]", "").trim().replaceAll(" +", " ");
result = result.replace("(?i)windows[^ ]", "Windows ");
它的作用是获取 result
字符串并替换为空字符串(""
空字符串)所有值在 </code> 之外的字符(白色space) 到 <code>~
范围 (printable ASCII).
附加代码简单地修剪所有 spaces 并将 2+ spaces 替换为一个。 最后一行处理 "Windows" 及其版本(例如 7、XP、Vista 等)之间的潜在可打印 ASCII 字符。