1

我是一个绝对的 Java 初学者。我在论坛上搜索过,但找不到这个问题的答案。

我有两个类,一个浏览句子的数组列表。我只附加了 for-each 循环,如下所示。“匹配”是另一个类的实例(包含模式/匹配器代码) 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();

}

我的问题是,如何将包含 aa / ee 结尾的匹配句子返回到第一堂课,并在那里打印?代码已编译,但是当我运行时我得到


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)

非常感谢您!

4

5 回答 5

4

Matcher.group()仅在已经匹配时才返回。你需要做这样的事情: -

if (m.matches()) {
    return m.group();
} else {
    return "";
}
于 2013-09-11T11:42:36.587 回答
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");

sentencesArrayList<String>的句子在哪里。

于 2013-09-11T11:54:10.217 回答
1

matchesorfind方法必须在方法之前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 ""
}
于 2013-09-11T11:43:19.527 回答
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 "";
        }
    }       
}
于 2013-09-11T11:47:56.293 回答
0
  • 不要在方法中构造 Pattern。那是昂贵的。将模式对象放入静态最终变量中。

  • 模式的正确用法如下:

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

这将打印所有匹配项,如果您只想要一个匹配项,请将 替换whileif

  • 我不知道这是否是故意的,但您的正则表达式与ee|aa字符串的结尾不匹配。它匹配ee或匹配aa字符串中的任何位置以及它之前的任何字符。例如,对于字符串,Fox preens in front of a vixen您的正则表达式返回 string Fox pree。不知道是不是故意的。

这是一个将列表或字符串集合作为参数的类,然后懒惰地查找所有以aaor结尾的单词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() {

            }
            };
    }

}
于 2013-09-11T14:11:09.813 回答