【问题标题】:Replace a string in java, whitespace independent替换java中的字符串,与空格无关
【发布时间】:2018-04-09 09:35:36
【问题描述】:

我需要用java替换一个字符串,但问题是搜索字符串可能比原始字符串有更多或更少的空格。

假设我们搜索

"find   me"

它应该匹配以下任何一个:

- "find me"
- "find       me"
- "find \n\r me"
- "find \t me"

原因是搜索字符串来自一个 jsoup 元素 innerhtml(),该元素具有插入空格的逻辑。

当然,使用一些智能正则表达式可以解决问题,但是我们必须从搜索字符串中安全地转义正则表达式字符(这并不保证只是一个简单的字母数字字符串,例如如果搜索字符串是 ' abc?def')

此外,预先替换输入中的所有双空格不是一种选择。

【问题讨论】:

  • 您能给我们提供有关您在哪里/如何进行匹配的背景信息吗?
  • @khelwood 说了什么。另外,看看Pattern.quote(),这会为您完成所需的转义。
  • 您可以先使用.text() 而不是.html() 来获取规范化空格字符串。
  • 这不是“为什么这段代码不起作用?”问题,所以关闭的原因不适用。 (投票重新开放)

标签: java string replace whitespace


【解决方案1】:

当然,使用一些智能的正则表达式可以解决问题,但是我们必须从搜索字符串中安全地转义正则表达式字符(不保证只是一个简单的字母数字字符串,例如如果搜索字符串是 ' abc?def')

这正是我会做的:

  • 在空格处分割搜索字符串
  • 使用Pattern.quote(...) 转义每个元素
  • \\s+ 重新加入元素

例子:

String searchRegex = Arrays.stream( searchString.split( "\\s+" ) )
                           .map( s -> Pattern.quote( s ) )
                           .collect( Collectors.joining( "\\s+" ) );

【讨论】:

    【解决方案2】:

    这里有一个简单的方法是修剪搜索字符串和目标字符串,然后规范化所有剩余的空格:

    boolean match(String input, String term) {
        if (input == null || term == null) {
            return false;
        }
    
        String s1 = input.trim().replaceAll("\\s+", " ");
        String s2 = term.trim().replaceAll("\\s+", " ");
    
        return s1.equals(s2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2023-03-24
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多