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,胡萝卜等待兔子在野外归来。 超过预期
它应该返回
福克斯狐狸跑来逃避狗狗。兔子兔子跑来逃避狐狸狐狸。 胡萝卜在野外等待兔子返回。
诚恳,
答案 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方法添加子字符串。
祝你好运,