繁体   English   中英

N次查找并替换字符串模式,其中在模式中定义了N

[英]Find and replace a string pattern N times where N is defined in the pattern

我正在处理来自纯文本消息(HL7)的文本格式并将其重新格式化以供显示。 一个示例是\\.sp5\\ 这意味着需要五个换行符。

所以我想我想做这样的事情:

Pattern.compile("\\\.sp(\d+)\\").matcher(retval).replaceAll("\n{$1}");

我的IDE告诉我\\d处有一个无效的转义序列,并且我不确定replaceAll参数是否会达到我的期望。 我认为该正则表达式描述的是“反斜杠点sp一个或多个数字的反斜杠”,我希望替换文本说“放入$ 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);
}

Java中的正则表达式要求将所有斜杠加倍。 这是因为“ \\”是字符串中的特殊字符,需要用额外的斜杠转义。 因此,您可能想要:

Pattern.compile("\\\\\\.sp(\\d+)\\\\").matcher(retval).replaceAll("\\n{$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");   
     }

您必须转义反斜杠,以便编译器将其忽略,但正则表达式引擎会看到它们。

Java源代码中的字符串文字中的反斜杠按照Java语言规范的要求解释为Unicode转义或其他字符转义。 因此,有必要在表示正则表达式的字符串文字中加双反斜杠,以防止它们被Java字节码编译器解释。

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

replaceAll()部分将无法执行您想要的操作(多次重复该替换操作),因为替换文本模式中没有相应的规定。 您必须使用.group(1)捕获整数,并使用Integer.valueOf()将其转换为整数,然后重复替换文本该次数。

您不能以这种方式使用正则表达式。

相反,您应该将匹配的(\\ d +)数字映射到执行.sp(\\ d)+)替换的循环。 我从未见过使用动态构造进行这种类型的替换,顺便说一句,正则表达式引擎将不得不键入匹配组以确保它是数字而不是字符串。

因此,我建议检索数字,并根据数字使用它来构造替换模式\\n\\n...\\n 然后即可更换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM