【问题标题】:Enter a newline character in a text box to be passed into `Matcher.replaceAll()` [duplicate]在要传递给“Matcher.replaceAll()”的文本框中输入换行符[重复]
【发布时间】:2021-02-19 13:45:09
【问题描述】:

我正在为一个安卓应用程序添加搜索/替换功能。

我希望用户能够使用正则表达式进行搜索和替换。搜索功能正常工作,但替换字符串 \n 中的换行符被解释为文字“n”。

这是我的代码正在做的事情:

Pattern.compile(search.getText().toString()).matcher(text).replaceAll(replace.getText().toString())

给定

  • 文本是CharSequence,内容为A \n\n\nB(注意“A”后面的尾随空格)
  • search 是一个包含 \s+\n 内容的文本框
  • replace 是一个文本框,内容为 \n

我希望上面代码的结果是 text = A\n\n\nB(删除了尾随空格)。

结果是 text = An\n\nB。即replace 文本框中的\n 被解释为文字'n'。

我想知道如何才能读取replace 的内容,以便\n 被解释为换行符。

请注意,我可以通过 捕获 换行符来实现示例中的预期结果,例如 search = \s+(\n)replace = $1。然而,这不是问题。

出于本次讨论的目的,我只考虑 Unix 行尾。

编辑:

使用 replace contents = \\n 会插入文字 '\n'。

A    


B

转化为

A\n

B

【问题讨论】:

标签: java android regex


【解决方案1】:

这里的问题似乎是 '' 本身就是一个特殊字符。您必须将其加倍才能使正则表达式将其视为必要的字符。对所有 '' 进行双重替换应该很有用。像这样

     yourString = yourString.replace("\", "\\");

【讨论】:

  • 这似乎不起作用。我已更新问题以反映这一点。
  • 这不起作用,因为它不回答当前问题。即,如何在用作替换模式的文字文本中使用换行符作为换行符。
【解决方案2】:

stackoverflow.com/a/4298836 中的Wiktor Stribiżew 建议的方法对我有用。

本质上,我们需要解析字符串并将每个转义字符替换为正确的转义序列。

这是我使用的代码:

private String unescape(final String input) {
    final StringBuilder builder = new StringBuilder();
    boolean isEscaped = false;
    for (int i = 0; i < input.length(); i++) {
        char current = input.charAt(i);
        if (isEscaped) {
            if (current == 't') {
                builder.append('\t');
            } else if (current == 'b') {
                builder.append('\b');
            } else if (current == 'r') {
                builder.append('\r');
            } else if (current == 'n') {
                builder.append('\n');
            } else if (current == 'f') {
                builder.append('\f');
            } else if (current == '\\' || current == '\'' || current == '"') {
                builder.append(current);
            } else {
                throw new IllegalArgumentException("Illegal escape sequence.");
            }
            isEscaped = false;
        } else if (current == '\\') {
            isEscaped = true;
        } else {
            builder.append(current);
        }
    }
    return builder.toString();
}

它不像上面链接的答案中的解决方案那样完整或正确,但它似乎可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2018-08-21
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多