尝试使用Regex查找短语并显示已找到的短语的Java应用程序

时间:2014-05-18 17:16:17

标签: java regex

Hy,

我有一个试图找到短语的应用程序。我的假设是短语以大写字母开头,以点结尾,之间可以包含任何内容。

贝娄是我的代码:

for(String s: manyLines)
                    {
                        Pattern pa = Pattern.compile("([A-Z]{1})(.*)(\\.)");
                        Matcher ma = pa.matcher(s);
                        if(ma.find())
                        {
                        manyPhrase.add(s);
            }

但是正则表达式似乎不起作用,因为很多Phrase(字符串的ArryList)它获取所有行而不仅仅是短语。

例如,我的输入文件有:

  福克斯狐狸跑来逃避狗狗。 AK;兔子兔跑去逃避狐狸   狐狸。 123.5,胡萝卜等待兔子在野外归来。   超过预期

它应该返回

  福克斯狐狸跑来逃避狗狗。兔子兔子跑来逃避狐狸狐狸。   胡萝卜在野外等待兔子返回。

诚恳,

5 个答案:

答案 0 :(得分:2)

.*

是贪婪的,并且在最后一段时间内匹配所有内容。

尝试非贪婪的匹配器

[A-Z].*?\\.

或更好的是,使用更精确的大写字母,非期间,期间"正则表达式:

[A-Z][^.]*\\.        

最后,如果您使用()进行分组,最好将(?:)用作非捕获组,除非您确实要存储子表达式的结果

答案 1 :(得分:1)

您可以使用[A-Z].+?\\.

这将匹配任何大写字母,后跟任何其他字符,直到找到。字符。通过使用?在我们的正则表达式中,我们创建了所谓的懒惰匹配(即,一旦找到下一位就会停止。)

你的问题是.*。这是一个贪婪的比赛,所以它会尝试尽可能匹配

答案 2 :(得分:1)

我认为这里的问题是你对.*做什么的假设。它不知道在这段时间之前继续寻找所有东西。你想要寻找的是任何不是句号([^.])的字符,发生零次或多次(*)。如果你只是使用.*,它会一直持续到最后并包括最后一个时期。

如果你想要分组(parens),请尝试使用此作为正则表达式模式:

([A-Z]{1})([^.]*)\\.

如果您只想匹配,请尝试将其作为正则表达式模式:

[A-Z]{1}[^.]*\\.

答案 3 :(得分:1)

您必须考虑. 该词组中允许的字符的一部分:

([A-Z^]{1})([^.]*)(\\.)

匹配是贪婪的,会选择尽可能多的符合你表达的字符。

答案 4 :(得分:0)

要替换的完整代码:

    for(String s: manyLines)
                    {
                        Pattern pa = Pattern.compile("([A-Z][^\\.]*\\.)");
                        Matcher ma = pa.matcher(s);
                        if(ma.find())
                        {
                            String correct = ma.group(0);
                        manyPhrase.add(correct);
            }
                    }

使用group方法添加子字符串。

祝你好运,