我正在处理纯文本消息(HL7)中的文本格式并重新格式化以供显示。一个例子是\.sp5\
。这意味着投入五个换行符。
所以我想我会想做这样的事情:
Pattern.compile("\\\.sp(\d+)\\").matcher(retval).replaceAll("\n{$1}");
我的IDE告诉我\d
处有一个无效的转义序列,我不确定replaceAll参数是否符合我的预期。我认为正则表达式正在描述“反斜杠点s一个或多个数字反斜杠”,我希望替换说“放入$ 1换行符”。
我该如何做到这一点?
解决方案是以下两位评论者的组合:
Pattern verticalSpacesPattern = Pattern.compile("\\\\\\.sp(\\d+)\\\\", Pattern.MULTILINE);
Matcher verticalSpacesMatcher = verticalSpacesPattern.matcher(retval);
while (verticalSpacesMatcher.find()) {
int lineBreakCount = Integer.parseInt(verticalSpacesMatcher.group(1));
String lineBreaks = StringUtils.repeat("\n", lineBreakCount);
String group = verticalSpacesMatcher.group(0);
retval = StringUtils.replace(retval, group, lineBreaks);
}
答案 0 :(得分:1)
java中的正则表达式要求所有斜杠加倍。 这是因为“\”是字符串中的特殊字符,需要使用额外的斜杠进行转义。 所以你可能想要:
Pattern.compile("\\\\\\.sp(\\d+)\\\\").matcher(retval).replaceAll("\\n{$1}");
答案 1 :(得分:1)
使用它:
public static void main(String[] args) throws Exception {
// Create a pattern to match comments
Pattern p =
Pattern.compile("\\\\.sp(\\d+)", Pattern.MULTILINE);
// Get a Channel for the source file
File f = new File("Replacement.java");
FileInputStream fis = new FileInputStream(f);
FileChannel fc = fis.getChannel();
// Get a CharBuffer from the source file
ByteBuffer bb =
fc.map(FileChannel.MAP_RO, 0, (int)fc.size());
Charset cs = Charset.forName("8859_1");
CharsetDecoder cd = cs.newDecoder();
CharBuffer cb = cd.decode(bb);
// Run some matches
Matcher m = p.matcher(cb);
int i = 0;
int n=0;
while (m.find())
n= Integer.parseInt(m.group(1)); //first group,0, is the whole string , 1 is the subgroup
for(i=0;i<n;i++)
System.out.println("\n");
}
答案 2 :(得分:1)
你必须转义反斜杠,以便编译器忽略它们,但正则表达式引擎会看到它们。
Java源代码中字符串文字中的反斜杠被Java语言规范解释为Unicode转义符或其他字符转义符。因此,必须在表示正则表达式的字符串文字中加倍反斜杠,以防止它们被Java字节码编译器解释。
http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
replaceAll()
部分不会执行您想要的操作(重复替换次数),因为替换文本模式中没有相关规定。您必须使用.group(1)
捕获整数,将其转换为Integer.valueOf()
的整数,然后将repeat转换为替换文本的次数。
答案 3 :(得分:0)
你不能那样使用正则表达式。
相反,您应该将匹配的(\ d +)数字映射到替换.sp(\ d)+)的循环。 我从未见过这种类型的替换,使用动态构造,而BTW正则表达式引擎必须键入匹配组以确保这是一个数字而不是字符串。
所以我建议检索数字并根据数字使用它构建替换模式\n\n...\n
。然后你可以替换。