2

我想用下面列出的另一个字符串替换字符串中的第一个空格字符。该单词可能包含许多空格,但只有第一个空格需要替换。我尝试了下面的正则表达式,但它没有用......

Pattern inputSpace = Pattern.compile("^\\s", Pattern.MULTILINE);  
String spaceText = "This split ";    
System.out.println(inputSpace.matcher(spaceText).replaceAll(" "));

编辑:: 这是我正在使用的外部 API,我有一个限制,我只能使用 "replaceAll" ..

4

5 回答 5

7

您的代码不起作用,因为它不考虑字符串开头和空格之间的字符。

将您的代码更改为:

Pattern inputSpace = Pattern.compile("^([^\\s]*)\\s", Pattern.MULTILINE);  
String spaceText = "This split ";    
System.out.println(inputSpace.matcher(spaceText).replaceAll("$1 "));

解释:

[^...]是匹配与提供的字符或字符类不匹配的字符(\\s是一个字符类)。

因此,[^\\s]*是零个或多个非空白字符。它被下面包围()

$1是第一个出现在().

Java 正则表达式参考

但是,首选方法是使用replaceFirst: (尽管这似乎不符合您的要求)

String spaceText = "This split ";
spaceText = spaceText.replaceFirst("\\s", " ");
于 2013-07-15T15:37:49.497 回答
5

您可以使用该String.replaceFirst()方法替换模式的第一次出现

System.out.println(" all test".replaceFirst("\\s", "test"));

并在String.replaceFirst()内部调用Matcher.replaceFirst()所以它相当于

Pattern inputSpace = Pattern.compile("\\s", Pattern.MULTILINE);  
String spaceText = "This split ";    
System.out.println(inputSpace.matcher(spaceText).replaceFirst(" "));
于 2013-07-15T15:37:52.147 回答
1

分两步进行:

  1. indexOf(" ") 会告诉你索引在哪里
  2. 结果 = str.substring(0, index) + str.substring(index+1, str.length())

这个想法是这样的,您可能需要根据 API 适当地调整索引值。

它应该比正则表达式更快,因为有 2x arraycopy 并且不需要文本编译模式匹配和东西。

于 2013-07-15T15:38:41.563 回答
1

可以使用 Apache StringUtils:

import org.apache.commons.lang.StringUtils;

public class substituteFirstOccurrence{

    public static void main(String[] args){

        String text = "Word1 Word2 Word3";

        System.out.println(StringUtils.replaceOnce(text, " ", "-"));

        // output: "Word1-Word2 Word3"
    }

}
于 2013-07-15T15:44:58.450 回答
0

我们可以简单地yourString.replaceFirst(" ", "");在 Kotlin 中使用。

于 2019-02-13T01:14:25.060 回答