6

我正在制作一个用正则表达式解析用户输入的 Java 程序。例如,如果用户输入/me eats,它应该匹配/me并将其替换为<move>。但是,Java 没有正确匹配,因为/它是正则表达式的特殊字符。如何使用转义符自动替换所有各种特殊的 Java 正则表达式字符?

例如:

  • /me变成\/me
  • *变成\*
  • [变成\[
  • 等等...

它被放入之前Pattern.compile

这不是一个命令系统。我允许用户指定如何表示角色扮演动作。如果有帮助,这里是用户如何指定他们认为角色扮演动作的模型:

将控制此系统的首选项窗格的模型

4

3 回答 3

18

Supuhstar,我相信这是您正在寻找的单线(参见在线演示):

String sanitized = subject.replaceAll("[-.\\+*?\\[^\\]$(){}=!<>|:\\\\]", "\\\\$0");

这会为以下所有字符添加反斜杠:

. + * ? [ ^ ] $ ( ) { } = ! < > | : - \

测试输入: String subject = ".+*?[^]$(){}=!<>|:-\\";

输出: \.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:-\\

接下来,如您所愿,您可以继续:

Pattern regex = Pattern.compile(sanitized);

笔记:

  1. 与 Perl 和 PHP 一样,Java 也有一种语法来转义整个字符串:将它放在\Q和之间\E。这Pattern.quote对你有用,但它引用的文本比你想要的更多。

  2. 这只是回答您添加反斜杠的特定要求的一种可能的解决方案。有关更多选项,另请参阅使用 Pattern.LITERAL 是否意味着与 Pattern.quote 相同?

于 2014-05-20T00:35:09.607 回答
0

只需使用Pattern.html#quote(java.lang.String)

public String quote(String input) {
    return Pattern.quote(input).substring(2, input.length() + 2); // quote() adds '\Q' and '\E', substring used to remove those.
}
String input = "/me eats";
String cmd = input.replaceAll(quote("/me"), /* replacement */);

现在,我假设这是一个命令系统,在这种情况下,我建议不要使用正则表达式进行解析。

通常,这是通过以下方式以更简单的方式完成的/command <arguments>...

public class Command {

    private final String name;
    private final String[] args;

    public Command(String name, String... args) {
        this.name = name;
        this.args = args;
    }

    public String getName() {
        return this.name;
    }

    public String[] getArgs() {
        return this.args;
    }

}

这种用法的一个例子:

String commandPrefix = "/";
String input = "/me eats";
if (input.startsWith(commandPrefix)) {
    String[] raw = input.split(" ");
    Command cmd = new Command(raw[0].substring(commandPrefix.length(), raw[0].length(), Arrays.copyOfRange(raw, 1, raw.length - 1);
    //cmd.getName() -> "me"
    //cmd.getArgs() -> ["eats"]
}

通过把它扔给决定如何执行命令的东西,你可以me像这样简单地处理命令:

public void onCommand(Command cmd) {
    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (String s : cmd.getArgs()) {
        if (first) { first = false; } else { sb.append(" "); }
        sb.append(s);
    }
    String action = sb.toString();
    //use the "action" string in whatever 3rd person context you desire.
}
于 2014-05-20T00:57:14.047 回答
0

不确定这是否可行,但如何:

String inputString = ....
inputString = Pattern.compile(inputString, Pattern.LITERAL).pattern();
//process inputString now

目前未经测试。如果实际上不正确,将删除答案。

于 2014-05-17T04:38:24.520 回答