2012-11-11 4 views
2

У меня есть текст; Я хочу извлечь пары слов, которые не разделены пунктуацией. Это код:Java regex skipping matches

//n-grams 
Pattern p = Pattern.compile("[a-z]+"); 
if (n == 2) { 
    p = Pattern.compile("[a-z]+ [a-z]+"); 
} 
if (n == 3) { 
    p = Pattern.compile("[a-z]+ [a-z]+ [a-z]+"); 
} 
Matcher m = p.matcher(text.toLowerCase()); 
ArrayList<String> result = new ArrayList<String>(); 

while (m.find()) { 
    String temporary = m.group(); 
    System.out.println(temporary); 

    result.add(temporary); 
} 

Проблема в том, что она пропускает некоторые совпадения. Например

"Меня зовут Джеймс"

, при п = 3, должны соответствовать

"мое имя" и "имя Джеймс"

, но вместо этого он соответствует только первому. Есть ли способ решить это?

ответ

4

Вы можете захватить его с помощью групп в упреждающей выборке

(?=(\b[a-z]+\b \b[a-z]+\b \b[a-z]+\b)) 

Это заставляет его захватить в два groups..So в вашем случае это будет

Group1->my name is

Group2- >name is james

+3

+1 Я ** знал **, был лучший способ. –

1

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

Например, регулярное выражение «121» будет соответствовать «31212142121» только дважды « ___121».

+0

Есть ли способ преодолеть это? –

+0

Нет. Вы можете сопоставить его, взяв его в 'group', используя' lookahead', как это '(? = (121))' – Anirudha

+0

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

1

Я склонен использовать аргумент для метода find()Matcher:

Matcher m = p.matcher(text); 
int position = 0; 
while (m.find(position)) { 
    String temporary = m.group(); 
    position = m.start(); 
    System.out.println(position + ":" + temporary); 
    position++; 
} 

Таким образом, после каждой итерации он снова выполняет поиск по первому индексу начала.

Надеюсь, что помогло!

+1

Это соответствует «name is bond», «ame is bond», «me is bond» ... :) –

+0

Oh! Правильно! Я думал о другом типе регулярного выражения, например, в поисках строки типа 'aba' в строке типа' abababa'. Выполнение _my way_ разрешает проблему и находит все вхождения. Извините за недопонимание! Для вас требуется другой подход. –