извлечь подстроку в Java - PullRequest
0 голосов
/ 17 марта 2011

У меня есть следующая строка:

"hello this.is.a.test(MainActivity.java:47)"

и я хочу иметь возможность извлечь MainActivity.java: 47 (все, что находится внутри '(' и ')'и только первый случай).

Я пытался с регулярным выражением, но кажется, что я делаю что-то не так.

Спасибо

Ответы [ 6 ]

4 голосов
/ 17 марта 2011

Вы можете сделать это самостоятельно:

int pos1 = str.indexOf('(') + 1;
int pos2 = str.indexOf(')', pos1);

String result = str.substring(pos1, pos2)

Или вы можете использовать commons-lang, который содержит очень хороший класс StringUtils с substringBetween()

1 голос
/ 17 марта 2011

Еще один ответ на ваш вопрос:


String str = "hello this.is.a.test(MainActivity.java:47) another.test(MyClass.java:12)";
Pattern p = Pattern.compile("[a-z][\\w]+\\.java:\\d+", Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(str);

if(m.find()) {
    System.out.println(m.group());
}

RegExp объяснил:

[a-z][\w]+\.java:\d+

[az]> Убедитесь, что мы начинаем с буквы ...
[\ w] +> ..., за которыми следуют буква, цифра или знак подчеркивания ...
\ .java:> ..., за которыми точно следует строка ".java:" ...
\ d +> ... заканчивается одной или несколькими цифрами

1 голос
/ 17 марта 2011

Это должно работать:

^[^\\(]*\\(([^\\)]+)\\)

Результат находится в первой группе.

1 голос
/ 17 марта 2011

Я думаю, что Regex немного лишнее.Я бы использовал что-то вроде этого:

String input = "hello this.is.a.test(MainActivity.java:47)";
String output = input.subString(input.lastIndexOf("(") + 1, input.lastIndexOf(")"));
0 голосов
/ 17 марта 2011

Попробуйте это:

String input = "hello this.is.a.test(MainActivity.java:47) (and some more text)";
Pattern p = Pattern.compile("[^\\)]*\\(([^\\)]*)\\).*");
Matcher m = p.matcher( input );
if(m.matches()) {
  System.out.println(m.group( 1 )); //output: MainActivity.java:47
}

Это также находит первый вхождение текста между (и), если их больше.

Обратите внимание, что в Java вы обычно заключаете выражения в неявно (* по крайней мере, с тем же эффектом), заключенные в ^ и $, то есть регулярное выражение должно соответствовать всей входной строке. Таким образом, [^\\)]* в начале и .* в конце необходимы.

0 голосов
/ 17 марта 2011

Псевдокод:

int p1 = location of '('
int p2 = location of ')', starting the search from p1
String s = extract string from p1 to p2

String.indexOf () и String.substring () ваши друзья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...