2

现在我有一个正则表达式,看起来像是"\\w+ \\w+"找到 2 个单词的短语,但是,它们不重叠。例如,如果我的句子是The dog ran inside,则输出会"The dog", "ran inside"在我需要它时显示"The dog", "dog ran", "ran inside"。我知道有一种方法可以做到这一点,但我对使用正则表达式太陌生了,不知道如何做到这一点。

谢谢!

4

4 回答 4

1

您可以使用前瞻、捕获组和单词边界锚点来执行此操作:

Pattern regex = Pattern.compile("\\b(?=(\\w+ \\w+))");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group(1));
} 
于 2012-09-18T07:42:01.267 回答
0

简单(大字符串更快)的方法是使用split

    final String[] arrStr = "The dog ran inside".split(" ");
    for (int i = 0, n = arrStr.length - 1; i < n; i++) {
        System.out.format("%s %s%n", arrStr[i], arrStr[i + 1]);
    }

输出

The dog
dog ran
ran inside

没有发现正则表达式的技巧

于 2012-09-18T07:31:17.997 回答
0

纯粹使用正则表达式是不可能的,你不能两次匹配相同的字符(“狗”不能在两个单独的组中)。像这样的东西根本不需要正则表达式,你可以简单地用空格分割字符串,然后按照你喜欢的方式组合它:

>>> words = "The dog ran inside".split(" ")
>>> [" ".join(words[i:i+2]) for i in range(len(words)-1)]
['The dog', 'dog ran', 'ran inside']

如果这不能解决您的问题,请提供有关您要完成的工作的更多详细信息。

于 2012-09-18T06:20:18.823 回答
0

使用先行获得第二个单词,将非先行与先行部分连接起来。

# This is Perl. The important bits:
#
# $1 is what the first parens captured.
# $2 is what the second parens captured.
# . is the concatenation operator (like Java's "+").

while (/(\w+)(?=(\s+\w+))/g) {
   my $phrase = $1 . $2; 
   ...
}

抱歉,对 Java 的了解不够,但这在 Java 中也应该很容易做到。

于 2012-09-18T06:20:35.513 回答