-2

我有一个长字符串变量X和另一个字符串(长度为一两个单词)Y。我想Y在它出现之前和之后找到 50 个单词X。如何使用 reg-ex 实现这一点。

4

4 回答 4

3

为什么这必须是一个正则表达式?如果它周围没有 50 个单词怎么办,因为匹配在字符串的开头?

考虑只定位匹配项,然后单独找到一个合适的“片段”围绕它,而不是试图将它全部塞进一个神奇的、无法维护的正则表达式中。

明确地这样做并没有错:找到匹配项,将片段增长到所需的大小,返回匹配项。使它成为一个有据可查的方法“extractSnippet”,而不是尝试在单个正则表达式中执行它。

于 2012-05-20T08:38:10.790 回答
1

检查这个 PHP 正则表达式,我很确定它也适用于 Java:

php > preg_match_all("/([a-z]+ ){4}donkey( [a-z]+){4}/","summer donna summer donna summer donkey hop hop hop hop bzzp",$matches); print_r($matches);
Array
(
  [0] => Array
    (
        [0] => donna summer donna summer donkey hop hop hop hop
    )

  [1] => Array
    (
        [0] => summer 
    )

  [2] => Array
    (
        [0] =>  hop
    )

)
于 2012-05-20T08:38:29.627 回答
1

Java 需要 Java.util.regex.* 库(最后一个 kliny 用于依赖项)来执行它。导入它并调用一个实例,例如:

Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher(name);
StringBuffer sb = new StringBuffer();
while(m.find()){
   sb.append(m.group()); //this appends the context of Pattern p to the appended sb
}

在 Pattern 中,可以调用常规的正则表达式语法。

我认为您可能会遇到在 y 字符串之前或之后可能没有 50 多个单词的问题。

粗略地说,我会说首先使用$y之类的模式检查是否存在以在 X 上执行。然后使用拆分操作和 " " 空格分隔符来计算单词的数量。从那里,它是一个计数问题。

于 2012-05-20T08:43:17.887 回答
1

此代码生成一个包含 300 个单词的字符串 (Word0 .. Word299),定义要搜索的目标 as "Word12 Word13",然后在该字符串之前最多找到 50 个单词,之后最多查找 50 个单词。

final StringBuilder b = new StringBuilder();
final String matchWords = "Word12 Word13";
for (int i = 0; i < 300; i++) b.append("Word").append(i).append(" ");
final Matcher m =
  Pattern.compile(
    "((?:\\S+\\s+){0,50})" + Pattern.quote(matchWords) + "((?:\\s+\\S+){0,50})"
  ).matcher(b.toString());
if (m.find()) System.out.println("Words before: " + m.group(1) +
    "\nAfter: " + m.group(2));
于 2012-05-20T09:25:45.977 回答