2013-09-11 1 views
0

Я абсолютный начинающий Java. Я искал на форумах, но не смог найти ответа на этот вопрос.Java Pattern/Matcher - возвращает совпадения от одного метода к другому

У меня есть два класса, один из которых просматривает арраилизатор предложений. Я прикрепляю только каждый цикл, как показано ниже. «Соответствие» - это экземпляр другого класса (содержащий код шаблона/сопряжения) matchEndings - это метод, прилагаемый ниже.

for (String sentence: sentences) { 
    String match = matching.matchEndings(sentence); 
    if (match.length() > 0) { 
     System.out.println(match); 
    } 
} 

Это метод.

public String matchEndings(String s){ 
Pattern p = Pattern.compile(".*?(aa|ee)"); 
Matcher m = p.matcher(s); 

return m.group(); 

} 

Мой вопрос, как я могу возвратить совпавшие предложения, содержащий аа/ВЕ окончаний, в первый класс, и напечатанное там? Код компилируется, но когда я бегу я получаю


Exception in thread "main" java.lang.IllegalStateException: No match found 
     at java.util.regex.Matcher.group(Unknown Source) 
     at java.util.regex.Matcher.group(Unknown Source) 

Большое спасибо заранее!

+0

Итак, вы хотите распечатать все линии, которые заканчиваются aa или ee? –

+0

Да, вот и все! – user2768479

ответ

2

Matcher.group() только возвращается, если есть совпадение. Вам нужно сделать что-то вроде этого: -

if (m.matches()) { 
    return m.group(); 
} else { 
    return ""; 
} 
+0

Спасибо, ребята! Моя единственная проблема сейчас в том, что она находит только первое появление в «предложении». Если строка «Hee Aaa Oaa», за которой следует новый символ строки, она возвращает только «Hee». Я знаю, что (m.find()) работал бы, если бы я хотел напечатать результат, но не сейчас, когда я намерен его вернуть. «Предложение» arraylist заполняется сканером из текстового файла. \t \t \t Сканер in = новый сканер (новый файл (args [0])); \t \t \t в то время как (in.hasNextLine()) { \t \t \t \t sentences.add (in.nextLine()); \t \t \t} Не знаю, как действовать. Возможно, вы могли бы помочь мне! Спасибо заранее, ребята – user2768479

+0

- ваша цель вернуть все слова, которые заканчиваются ee или aa в строке? –

+0

Да! То, что я намереваюсь сделать. – user2768479

1

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

public String matchEndings(String s){ 
    Pattern p = Pattern.compile("(aa|ee)$"); 
    Matcher m = p.matcher(s); 

if (m.matches) { 
    return m.group(); 
} else { 
    return "" 
} 
0
import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class PotenssienSumma { 
    public static void main(String[] args) {    
     ArrayList<String> sentences = new ArrayList<>(10); 
     sentences.add("aa"); 
     sentences.add("1324"); 
     for (String sentence: sentences) { 
      String match = Matching.matchEndings(sentence); 
      if (match.length() > 0) { 
       System.out.println(match); 
      } 
     } 
    } 
} 
class Matching{   
    public static String matchEndings(String s){ 
     Pattern p = Pattern.compile(".*?(aa|ee)"); 
     Matcher m = p.matcher(s); 
     if (m.matches()) { 
      return m.group(); 
     } else { 
      return ""; 
     } 
    }  
} 
2

Это кажется излишним использовать RegEx, когда все, что вам нужно, это просто endsWith(String):

public void print(final List<String> sentences, final String... endings){ 
    for(final String sentence : sentences){ 
     for(final String ending : endings){ 
      if(sentence.endsWith(ending)){ 
       System.out.println(sentence); 
       break; 
      } 
     } 
    } 
} 

Вышеуказанный метод будет проходить через List<String> предложений и распечатать все предложения, которые заканчиваются одним из элементов в endings. Для использования, вы можете попробовать:

print(sentences, "aa", "ee"); 

Где sentences Ваш ArrayList<String> предложений.

0
  • Не строите шаблон в методе. Это дорого. Поместите объект шаблона в статическую конечную переменную.

  • Правильное использование для моделей заключается в следующем:

    while(matcher.find()) { 
        sysout(matcher.group()); 
    } 
    

Это будет печатать все матчи, если вы хотите только один матч, заменить while с if.

  • Я не знаю, является ли это преднамеренным, но ваше регулярное выражение не соответствует ee|aa до конца строки. Он соответствует ee или aa в любом месте строки вместе с любыми символами, предшествующими ей. Например, для строки Fox preens in front of a vixen ваше регулярное выражение возвращает строку Fox pree. Не знаю, предназначено ли это.

Вот класс, который принимает список или набор строк в качестве аргумента, а затем лениво находит все слова, которые заканчиваются на aa или ee. Он имеет метод main, который вы можете запустить для тестирования.

public class Endings implements Iterable<String> { 
     private final Iterable<String> strings; 
     private static final Pattern pat = Pattern.compile("(?<=^|\\s)\\S*(aa|ee)(?=\\s|$)"); 

     public static void main(String[] args) { 
      Endings endings = new Endings(Arrays.asList("This testaabb testee testaa", "Test2aa Test3ee ", "no match")); 
      for(String word : endings) { 
       System.out.println(word); 
      } 
     } 

     public Endings(Iterable<String> strings) { 
      this.strings = strings; 
     } 

     public Iterator<String> iterator() { 
      return new Iterator<String>() { 
      private Iterator<String> iter = strings.iterator(); 
      private Matcher m; 
      private String result; 
      public boolean hasNext() { 
       if (result == null) { 
        if (m == null) { 
         if (iter.hasNext()) { 
          m = pat.matcher(iter.next()); 
         } else { 
          return false; 
         } 
        } 
        if (m.find()) { 
         result = m.group(); 
         return true; 
        } else { 
         m = null; 
         return hasNext(); 
        } 
       } else { 
        return true; 
       } 
      } 

      public String next() { 
       if (result != null) { 
        String ret = result; 
        result = null; 
        return ret; 
       } else { 
        throw new NoSuchElementException(); 
       } 
      } 

      public void remove() { 

      } 
      }; 
    } 

} 

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

  • Нет связанных вопросов^_^