2017-02-22 8 views
-4

Я хочу, чтобы заменить слово, начинающееся с # в строке, которая содержит набор слов с тем же словом (# опущен)Java Regex заменить шаблон в определенной строке

например

«word1 WORD2 #user "следует заменить на "word1 word2 пользователя"

Может кто-нибудь мне помочь?

+0

Является ли ваша строка что-то вроде '# user' или как' #user #word #anotherWord ... '? – SantiBailors

+0

Вы просто хотите удалить #, прикрепленную к строке? – sadlyblue

ответ

5

Вы можете использовать регулярное выражение. Начнём с

yourText = yourText.replaceAll("#(\\S+)", "$1"); 

в регулярном выражении:

  • \S представляет непробельного символов
  • + представляет один или более
  • \S+ представляет собой один или несколько не-пробельных символов
  • (\S+) -parenthesis создать группу содержит нг один или несколько не-пробельных символов, эта группа будет индексироваться 1

замена

  • $1 замена позволяет использовать содержимое группы 1.

В других слова он попытается найти #non-whitespaces (который и заменит его на non-whitespaces часть.

Но для этого решения не требуется #. Чтобы сделать это, мы могли бы проверить, если до # есть

  • пробельное пространство \s,
  • или начала строки ^.

Чтобы проверить, есть ли что-то перед нашим элементом, без фактического включения его в наш матч, мы можем использовать look-behind (?<=...).

Итак, наше окончательное решение может выглядеть

yourText = yourText.replaceAll("(?<=^|\\s)#(\\S+)", "$1"); 
+1

работал отлично. Благодарю. –

+1

@ IsurangaPerera Я обновил этот ответ, чтобы исправить одну проблему. Проверьте обновленную версию. – Pshemo

0

да, String.replaceAll()

String foo = "#user" 
foo = foo.replaceAll("#", ""); 
+2

Это приведет к удалению всех '#' независимо от того, где они находятся. – Pshemo

+1

@IsurangaPerera 'replace' также заменяет * все * вхождения искомого текста. Единственная разница между 'replace' и' replaceAll' заключается в том, что 'replaceAll' использует синтаксис regex, а' replace' использует литералы. – Pshemo

+0

@Pshemo спасибо, что полностью забыл –

0

Вы не очень ясный случай использования, но мои предположения с примерами кода:

  1. Опустить все символы с replaceAll функции
  2. опустить только первый символ с подстрока функция

    общественного класса TestRegex {

    public static void main(String[] args) { 
    
        String omitInStart = "#user"; 
        String omitInMiddle = "#user"; 
        String omitInEnd = "#user"; 
        String omitFewSymbols = "#us#er"; 
    
        List<String> listForOmit = Arrays.asList(omitInStart, omitInMiddle, omitInEnd, omitFewSymbols); 
        listForOmit.forEach(e -> System.out.println(omitWithReplace(e))); 
    
        listForOmit.forEach(e -> System.out.println(omitFirstSymbol(e))); 
    
    } 
    
    private static String omitFirstSymbol(String stringForOmit) { 
        return stringForOmit.substring(1); 
    } 
    
    private static String omitWithReplace(String stringForOmit) { 
        String symbolForOmit = "#"; 
        return stringForOmit.replaceAll(symbolForOmit, ""); 
    } 
    

    }

Смежные вопросы