gpt4 book ai didi

java - 转义正则表达式字符串中的每个文字而不是引用整个字符串

转载 作者:行者123 更新时间:2023-11-30 03:30:03 31 4
gpt4 key购买 nike

答案here建议使用 Pattern.quote 来转义特殊的正则表达式字符。

Pattern.quote 的问题是它对整个字符串进行转义,而不是对每个特殊字符进行转义。

这是我的情况:
我从用户那里收到一个字符串,需要在文档中搜索它。由于用户无法传递换行符(这是我无法访问的第 3 方 API 中的错误),我决定将任何空白序列视为“\s+”并使用正则表达式来搜索文档。这样用户就可以发送一个简单的空格而不是换行符。

例如,如果文档是:

The \s metacharacter is used to find a whitespace character.

A whitespace character can be:

  • A space character
  • A tab character
  • A carriage return character
  • A new line character
  • A vertical tab character
  • A form feed character

  • 然后是接收到的字符串

    String receivedStr = "The \s metacharacter is used to find a whitespace character. A whitespace character can be:";

    应该可以在文档中找到。

    为了实现这一点,我想引用该字符串,然后用字符串“\s+”替换任何空白序列。
    使用以下代码:

    receivedStr = Pattern.quote(receivedStr).replaceAll("\\s+", "\\\\s+");

    产生正则表达式:

    \QThe\s+\s\s+metacharacter\s+is\s+used\s+to\s+find\s+a\s+whitespace\s+character.\s+A\s+whitespace\s+character\s+can\s+be:\E

    这当然会忽略我添加的 "\s+" 而不是预期的:

    The\s+\\s\s+metacharacter\s+is\s+used\s+to\s+find\s+a\s+whitespace\s+character.\s+A\s+whitespace\s+character\s+can\s+be:

    仅转义“\s”文字,而不转义整个字符串。

    是否有 Pattern.quote 的替代方案可以转义单个文字而不是整个字符串?

    最佳答案

    我建议这样:

    String re = Stream.of(input.split("\\s+"))
    .map(Pattern::quote)
    .collect(Collectors.joining("\\s+"));

    这可以确保所有内容都被引用(包括否则会被解释为环视并可能导致匹配查找指数爆炸的内容),并且任何用户输入的空格最终都会成为不带引号的 \s+

    输入示例:

    Lorem \\b ipsum \\s dolor (sit) amet.

    输出:

    \QLorem\E\s+\Q\b\E\s+\Qipsum\E\s+\Q\s\E\s+\Qdolor\E\s+\Q(sit)\E\s+\Qamet.\E

    关于java - 转义正则表达式字符串中的每个文字而不是引用整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276454/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com