2013-10-12 4 views
2
String text; 
System.out.println(text); 

В консоли это выглядит следующим образом:Как удалить вторую подстроку с регулярным выражением?

The US..................................... 
Illinois Commerce .......... .............. 
........................................... 
..........................Illinois Commerce 

Мне нужно избавиться от второй подстроки Illinois Commerce


Это то, что я пробовал:

text = text.replaceAll("(?:Illinois Commerce:.*?){2}", ""); 

Я получаю java.lang.ArrayIndexOutOfBoundsException: 1

+0

Каков ваш ожидаемый выход? Удалить полную строку или только этот текст? –

+0

Удалить второе знакомство с 'Illinois Commerce' –

+0

Строка' text' должна выглядеть точно так же, но без этого второго появления 'Illinois Commerce' –

ответ

2

Я не буду использовать регулярное выражение для этого. Что я хотел бы сделать это:

  • Найти индекс первого вхождения "Illinois Commerce"
  • Получить подстроку index + 1 до конца.
  • Замените "Illinois Commerce" на эту подстроку. Это позволит убедиться, что я не заменяю событие 1 st, потому что он не будет полностью доступен в этой подстроке.
  • Затем соедините первую часть строки с полученной подстрокой.

Это как код будет идти, как:

int index = text.indexOf("Illinois Commerce");  
String result = text.substring(0, index + 1) + 
       text.substring(index + 1).replace("Illinois Commerce", "");  
System.out.println(result); 

  • text.substring(0, index + 1) будет принимать строку, пока I первого Illi.....

  • text.substring(index + 1) начнется с l первых Illi.... до конца строки. Таким образом, единственная строка для замены - это второе вхождение.

+0

+1 для хранения вещей простыми и не использующими регулярное выражение – exexzian

+0

@Downvoter Ухаживать за комментариями. –

5

Вы можете попробовать это:

text = text.replaceFirst("(Illinois Commerce(?s).*?)Illinois Commerce", "$1"); 
+2

'replaceAll()' для регулярных выражений. –

+2

@RohitJain: 'replaceFirst()' это то, что я искал. –

3

Это должно сделать это при условии, что следит за пропусками или в конце строки.

text = text.replaceAll("Illinois Commerce(?= ?$)", ""); 

Или следующее будет работать для этого случая.

text = text.replaceAll("\bIllinois Commerce\s*$", ""); 
1

Поскольку существует только два случая, lastIndexOf может быть лучше, чем регулярное выражение для этого случая.

В любом случае, ниже приведены регс и способ lastIndexOf.

public static void main(String[] args) { 

    String test = "The US.....................................\n" + 
     "Illinois Commerce .......... ..............\n" + 
     "...........................................\n" + 
     "..........................Illinois Commerce \n"; 
    String toFind = "Illinois Commerce"; 

    System.out.print("regex\n"); 
    System.out.println(test.replaceAll("(?s)^(.*)"+toFind+"(.*)$", "$1$2")); 

    System.out.print("\nlastIndexOf\n"); 
    int start = test.lastIndexOf(toFind); 
    System.out.println(test.substring(0, start) 
      + test.substring(start+toFind.length())); 
} 
Смежные вопросы