- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组包含隐藏字符的命令,写在文本文件中。它们被一一读取并发送到服务器来执行命令。
正确设置特殊字符的格式非常重要,但它们不能简单地在文本文件中写为 "\u0002"
,例如,这将被解释为 "\u0002"
,而不是 <STX>
我正在寻找的角色。
因此,我所做的是将它们写入以下格式的文本文件中:
$'\x02'test$'\x03'
我用 java 编写了一个正则表达式来提取数值,如下所示:
"\\$'\\\\x(\w\w)'".
(注意额外的转义字符,转义 $
和 \
)
我的问题是:如何获取十六进制字符 ( \w\w
),然后将它们转换为字符串中的 Unicode 字符,最好使用 String.format?
我知道我可以使用 "$1"
物理抓取字符,如"(\w\w)"
是每个正则表达式模式中的第一个也是唯一的组。但是,我在转换方面遇到了问题。我尝试过以下方法:
String.replaceAll("\\$'\\\\x(\w\w)'",
Character.toString((char)Integer.parseInt("$1")));
但我在 Integer.parseInt("$1")
方面遇到问题部分,如$1
被解释为字符串 "$1"
,而不是捕获的组(例如,02)。
作为一种快速解决方法,我为我需要的每种情况实现了一种可行的解决方法。 (例如:String.replace("\\$'\\\\x(02)'", Character.toString((char) (int)0x0002))
)。然而,这显然是一种糟糕的形式,对于解析任何情况都没有效果。
如果有人可以帮助我并指出我的文档/解释原因 $1
被解释为"$1"
而不是被捕获的组,以及解决方案/解决方法,我们将不胜感激。
编辑:
感谢下面的nhahtdh。他的答案是正确的,尽管我做了一个小修改:
static String handleEscape(String input) {
Pattern p = Pattern.compile("\\$'\\\\x(\\w\\w)'");
Matcher m = p.matcher(input);
StringBuffer result = new StringBuffer();
while (m.find()) {
m.appendReplacement(result, Character.toString((char) Integer.valueOf(m.group(1), 16)));
}
m.appendTail(result);
return result.toString();
}
我改变了Integer.parseInt(m.group(1))
至Integer.valueOf(m.group(1), 16)
,将任何正确的字符串正确转换为关联的十六进制值。
最佳答案
由于在替换之前需要对匹配的文本进行操作,因此需要使用Matcher
中的低级API类来手动执行匹配和替换。
static String handleEscape(String input) {
Pattern p = Pattern.compile("\\$'\\\\x(\\w\\w)'");
Matcher m = p.matcher(input);
StringBuffer result = new StringBuffer();
while (m.find()) {
m.appendReplacement(result,
Character.toString((char) Integer.parseInt(m.group(1), 16)));
}
m.appendTail(result);
return result.toString();
}
关于java - 在java中使用正则表达式格式化字符串,如何将捕获的组转换为特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610569/
我是一名优秀的程序员,十分优秀!