2012-02-21 2 views
1

У меня есть строка, которая содержит следующую подстроку:Extract сложной строки из двух строк

[Qual:3] [Text:PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1] [Elem:123]

я хотел бы, чтобы извлечь часть между [Text: и ] т.е. PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1.

Как это сделать?

+2

'\\ [Текст: (. *) \\]. *' От верхней части головы –

+1

Используйте 'String.substring (int, int)' и 'String.indexOf (String, int) ' – mcfinnigan

+0

Я пытался изменить варианты предложений здесь http://stackoverflow.com/questions/1216601/how-to-extract-value-betwen-two-string-using-regex – mip

ответ

4
Pattern p = Pattern.compile("\\[Text:(.*?)\\]"); 
Matcher m = p.matcher("[Qual:3] [Text:PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1] [Elem:123]"); 
m.find(); 
System.out.println(m.group(1)); 

Дает:

PIX 1252471471953/YHYF/PPP121.40/10RTY10/NOLXX08X1 

\\[ и \\] должны избежать скобок, которые являются специальными символами в регулярных выражениях. .*? является неживым квантором, поэтому он останавливает копирование символов, когда он достигает закрывающей скобки. Эта часть регулярного выражения предоставляется внутри группы захвата (), к которой вы можете получить доступ с помощью m.group(1).

2

Используйте следующую строку в регулярное выражение:

"\\[Text:(.*?)\\]" 

Первая группа захвата даст вам точно подстроку вы хотите.

Нежелательная игра (.*?) обязательна для того, чтобы остановить ее на первом ], а также [Elem:123].

+0

Ударьте меня к нему! +1. @mip, обратите внимание на разницу между '. *?' и '. *'. Один из комментаторов предложил «. *», Но это не работает; он не останавливается там, где должен. –

0
String.substring(int beginIndex, int endIndex) 

Возвращает новую строку, которая является подстрокой этой строки.

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

или ....

Вы можете использовать

String.indexOf(String str) 

Чтобы получить индекс начала и конца совпадения и скопировать содержимое в новую строку результата.

Вы можете использовать

String.matches(String regex) 

Однако писать регулярные выражения можно получить трудно,

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

Я надеюсь, что это помогает.

0

Вместо использования "\\[Text:(.*?)\\]", как и другие предложили, я бы на один шаг дальше и использовать lookarounds отфильтровать текст, который вы не хотите:

(?<=\\[Text:).*?(?=\\])

Это будет точно соответствовать текст вы не хотите выбирать группу захвата.

+0

спасибо за это. Как будет выглядеть Java? Я заменил бы «m.find» и «m.group (1)»? – mip

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