2015-04-09 4 views
7

Я просматриваю упражнения Java CodingBat. Here это один я только что закончил:Regex для замены определенных символов до и после определенной подстроки

Учитывая строку и непустую строку слова, возвращает строку, изготовленную из каждого полукокса непосредственно перед и сразу после каждого появления слова в строке. Игнорируйте случаи, когда нет символа до или после слова, и символ может быть включен дважды, если он находится между двумя словами.

Мой код, который работает:

public String wordEnds(String str, String word){ 

    String s = ""; 
    String n = " " + str + " "; //To avoid OOB exceptions 

    int sL = str.length(); 
    int wL = word.length(); 
    int nL = n.length(); 

    int i = 1; 

    while (i < nL - 1) { 

     if (n.substring(i, i + wL).equals(word)) { 
      s += n.charAt(i - 1); 
      s += n.charAt(i + wL); 
      i += wL; 
     } else { 
      i++; 
     } 
    } 

    s = s.replaceAll("\\s", ""); 

    return s; 
} 

Мой вопрос о регулярных выражениях. Я хочу знать, выполнено ли это с помощью выражения regex, и если да, то как?

+0

Эта проблема может быть трудно решить с помощью регулярных выражений Java, поскольку совпадения могут пересекаться, например. 'abcXY1XYijk' на' XY' будет иметь 'cXY1' и' 1XYi' как группы. –

+0

Большой вопрос, кстати^^ –

+0

добавить ввод и ожидаемый выход – vks

ответ

3

Вы можете использовать Java регулярное выражение объектов Pattern и Matcher для этого.

public class CharBeforeAndAfterSubstring { 
    public static String wordEnds(String str, String word) { 
     java.util.regex.Pattern p = java.util.regex.Pattern.compile(word); 
     java.util.regex.Matcher m = p.matcher(str); 
     StringBuilder beforeAfter = new StringBuilder(); 

     for (int startIndex = 0; m.find(startIndex); startIndex = m.start() + 1) { 
      if (m.start() - 1 > -1) 
       beforeAfter.append(Character.toChars(str.codePointAt(m.start() - 1))); 
      if (m.end() < str.length()) 
       beforeAfter.append(Character.toChars(str.codePointAt(m.end()))); 
     } 

     return beforeAfter.toString(); 
    } 
    public static void main(String[] args) { 
     String x = "abcXY1XYijk"; 
     String y = "XY"; 
     System.out.println(wordEnds(x, y)); 

    } 
} 
+0

. Я ценю, что «может быть» частью вопроса является неоднозначным. В этом случае он должен быть включен или тест не выполнен. – alanbuchanan

+0

@alanbuchanan Отредактированный ответ, пожалуйста, проверьте. Добавлена ​​немного больше логики индексирования, чтобы убедиться, что перекрытия учтены должным образом. –

+0

Это не будет работать с 16/17 самолетами Unicode.Пожалуйста, прекратите использование 'charAt': он не подходит для цели. – tchrist

1

Чтобы получить строку, содержащую символ до и после каждого вхождения одной строки в другую, вы можете использовать выражение регулярных выражений:

"(^|.)" + str + "(.|$)" 

, а затем вы можете перебирать группы и объединить их.

Это выражение будет искать (^|.), либо начало строки ^ или любой символ ., а затем str значение, а затем (.|$), любой символ . или конец строки $.

Вы могли бы попробовать что-то вроде этого:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public String wordEnds(String str, String word){ 
    Pattern p = Pattern.compile("(.)" + str + "(.)"); 
    Matcher m = p.matcher(word); 
    String result = ""; 
    int i = 0; 
    while(m.find()) { 
     result += m.group(i++); 
    } 
    return result; 
} 
+0

как это сделать 'возвращать строку из каждого символа непосредственно перед и сразу после каждого появления слова в строке'? –

+0

@Scary Wombat Спасибо за отзыв. Ты прав. Я заменял вместо того, чтобы возвращать только те символы, противоположные тому, что было задано. Обновлен ответ. –

+0

Ваш код терпит неудачу в большинстве тестов по адресу http://codingbat.com/prob/p147538, из которого OP пытается учиться. – user883499

1
(?=(.|^)XY(.|$)) 

Попробуйте this.Just захватить снимки и удалить None или empty values.See демо.

https://regex101.com/r/sJ9gM7/73

+0

Это не учитывает тот факт, что 'XY' может быть чем-то другим, как определено' str' в вопросе – alanbuchanan

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