繁体   English   中英

如何匹配正则表达式中的“转义”非可打印字符?

[英]How to match “escape” non-printable character in a regex?

我找到了howto, http ://answers.oreilly.com/topic/214-how-to-match-nonprintable-characters-with-a-regular-expression/,但没有代码\\ e,\\ x1b,\\ x1B在Java中为我工作。

编辑

我正在尝试替换Linux终端命令输出的ANSI转义序列(特别是颜色序列)。 在Python中,替换模式类似于“ \\ x1b [34; 01m”,表示蓝色粗体文本。 同样的模式在Java中不起作用。 我试图单独替换“ [34; 01m”,并且它起作用了,所以问题是\\ x1b。 正在使用Pattern.quote()进行“ [”转义。

编辑

Map<String,String> escapeMap = new HashMap<String,String>();
escapeMap.put("\\x1b[01;34m", "</span><span style=\"color:blue;font-weight:bold\">");
FileInputStream stream = new FileInputStream(new File("/home/ch00k/gun.output"));
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
String message = Charset.defaultCharset().decode(bb).toString();
stream.close();
String patternString = Pattern.quote(StringUtils.join(escapeMap.keySet(), "|"));
System.out.println(patternString);
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(message);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, escapeMap.get(matcher.group()));
    }
matcher.appendTail(sb);
String formattedMessage = sb.toString();
System.out.println(formattedMessage);

编辑这是我最终得到的代码:

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.lang3.*;

class CreateMessage {
    public static void message() throws IOException {
        FileInputStream stream = new FileInputStream(new File("./gun.output"));
        FileChannel fc = stream.getChannel();
        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        String message = Charset.defaultCharset().decode(bb).toString();
        stream.close();
        Map<String,String> tokens = new HashMap<String,String>();
        tokens.put("root", "nobody");
        tokens.put(Pattern.quote("[01;34m"), "qwe");
        String patternString = "(" + StringUtils.join(tokens.keySet(), "|") + ")";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(message);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            System.out.println(tokens.get(matcher.group()));
            matcher.appendReplacement(sb, tokens.get(matcher.group()));
        }
        matcher.appendTail(sb);

        System.out.println(sb.toString());

    }
}

文件gun.output包含ls -la --color=always /的输出ls -la --color=always /现在,问题是,如果我尝试匹配Pattern.quote("[01;34m") ,我将得到NullPointerException。 除了包含[的字符串]之外,其他所有内容都匹配,即使我引用了它们也是如此。 例外情况如下:

Exception in thread "main" java.lang.NullPointerException
    at java.util.regex.Matcher.appendReplacement(Matcher.java:699)
    at org.minuteware.jgun.CreateMessage.message(CreateMessage.java:32)
    at org.minuteware.jgun.Main.main(Main.java:23)

编辑

因此,根据http://java.sun.com/developer/technicalArticles/releases/1.4regex/ ,转义字符应与"\"匹配,这在我的情况下确实有效。 问题是,如果我使用tokens.put("\" + Pattern.quote("[01;34m"), "qwe"); ,我仍然得到上述NPE。

quote()用于制作与输入字符串verbatim匹配的模式。 您的字符串中包含模式语言。 查看quote()的输出-您将看到它试图从字面上找到四个字符\\ x1b。

FWIW,我一直在从彩色的log4j文件中剥离ANSI颜色代码,这种小图案似乎可以解决我遇到的所有情况:

Pattern.compile("(\\u001B\\[\\d+;\\d+m)+")

ansi转义序列的格式如下[\\ 033 [34; 01m]

其中\\ 033是ANSI字符033(十进制)或十六进制1b或十进制27。 您需要使用以下正则表达式:

Pattern p = Pattern.compile("\033\\[34;01m");

在Java字符串中使用不可打印字符时,可以使用八进制(\\ 033)或十六进制(\\ x1b)表示形式。

正则表达式中“转义”字符的正确值为\

暂无
暂无

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

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