2014-02-12 5 views
0

Мне нужно вырезать хвост строки в некоторых случаях - я сделал это с indexOf и подстрокой, но это замедлило мой код ((я думал о регулярных выражениях, но у этих хвостов только подобные начинания - это не «стабильный» слово Например, у меня есть такая строкаудалить весь текст после найденного слова java

aaaaa bbb cc (bb) (r-1hh) 

и мне нужен результат

aaaaa bbb cc (bb) 

но также может быть такой строки

aaaaa bbb cc (bb) (r3-34fff) 

или

aaaaa bbb cc (bb) [tagBB- na] 

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

Другой вопрос - это IndexOf или Substring использует regex в java?

+0

IndexOf быстрее, чем регулярное выражение.Если вы хотите получить точное соответствие, почему вы хотите регулярное выражение? – aalku

ответ

1

Как найти регулярное выражение позиции соответствия:

Pattern p = Pattern.compile("i.*t"); 
String s = "my input string"; 
Matcher m = p.matcher(s); 
if (m.find()) { 
    System.out.println("match begins at " + m.start()); // 3 
    System.out.println("match ends at " + m.end()); // 11 
} else { 
    System.out.println("no match found"); 
} 

Но вы можете удалить отставая текст так:

String res = s.replaceFirst("^(.* input).*", "$1"); 
System.out.println("'" + res + "'"); 

Или использовать точное совпадение без побега каждого специального CHAR таким образом:

String res = s.replaceFirst("^(.* " + Pattern.quote("^something$wierd^") + ").*", "$1"); 
System.out.println("'" + res + "'"); 
+0

ничего себе! это то, чего я ожидал. Спасибо – curiousity

1

Вы можете написать регулярное выражение, которое содержит что-либо, кроме ), и заканчивается на ), поэтому вы избегаете соответствия ни одного после первого ).

+0

это не мое дело - потому что несколько раз у меня есть достоверная информация в скобках. (см. первый образец с (bb)), но в любом случае вы могли бы предоставить образец? – curiousity

+0

«Иногда» не является хорошей комбинацией с регулярным выражением, вы должны иметь возможность указать его абсолютно, чтобы избежать ошибок. Соответствие 'aaaaa bbb cc (bb)' довольно просто, но как вы решаете, нужна ли вам остальная часть строки или нет? – Smutje

+0

Я написал решение alg. для этого - это специфично для логики проекта. Но как я понял, регулярное выражение не могло дать мне ничего подобного Индексу? Regex хорош для поиска постоянных строк. Я не ошибаюсь? – curiousity

0

Вы можете использовать $, чтобы соответствовать концу строки, а затем найти общий шаблон для вашего хвоста. Всегда ли это буквенно-цифровой символ/тире/пробел, расположенный между [] или()? Тогда это ваш образец.

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

0

Вы спрашивали:

Может ли регулярное выражение найти индекс строки?

Вы можете использовать Pattern и Matcher, чтобы добиться этого. Только что заметил, что кто-то еще прокомментировал это, поэтому я не буду приводить пример.

Способы String IndexOf или подстрока используют регулярное выражение в Java?

Нет, строка в java использует синтаксический анализ символов. Вы можете увидеть Javadoc или источник для более подробной информации об этом. Вы можете добиться этого с Java довольно легко, этот пример может быть аналогична существующей реализации:

public String truncate(String str, String tail) { 
    int lengthOfTail = tail.length(); 
    int indexOfTail = str.indexOf(tail); 
    return str.substring(0, indexOfTail + lengthOfTail); 
} 

(обработка ошибок опущено для ясности)

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