2013-07-15 2 views
1

Я хочу заменить первый символ пробела в строке другой строкой, указанной ниже. Слово может содержать много пробелов, но нужно заменить только первое пространство. Я попробовал регулярное выражение ниже, но это не сработало ...Замена только первого пробела в строке

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

EDIT :: Это внешний API, который я использую, и у меня есть ограничение, что я могу только использовать «replaceAll» ..

ответ

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 regex reference.

Предпочтительный способ, однако, было бы использовать replaceFirst: (хотя это, кажется, не соответствует вашим требованиям)

String spaceText = "This split "; 
spaceText = spaceText.replaceFirst("\\s", " "); 
+0

Спасибо .. что работал .. Вы можете объяснить это? – Phoenix

+0

@Phoenix См. Редактирование. – Dukeling

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(" ")); 
1

делать в 2 этапа:

  1. IndexOf (»«) покажет вам, где индекс
  2. результат = str.substring (0, индекс) + str.substring (индекс + 1, str.length())

Идея состоит в том, что вам, возможно, необходимо соответствующим образом скорректировать значения индекса в соответствии с API.

Он должен быть быстрее, чем регулярное выражение, потому что есть 2x arraycopy и не нужно компилировать шаблон для компиляции текста и прочее.

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" 
    } 

}