使用java查找围绕模式的子字符串

时间:2012-05-20 08:30:18

标签: java regex substring

我有一个长字符串变量X和另一个字符串(一个或两个字长)Y。我想在Y之前和之后找到50个单词,它出现在X中。我怎样才能使用reg-ex。

实现这一目标

4 个答案:

答案 0 :(得分:3)

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

考虑只是找到匹配,然后分别找到一个合适的“片段”围绕它,而不是试图把它全部塞进一个神奇的,不可维护的正则表达式。

明确地做这件事没有错:找到匹配,将片段增长到所需的大小,返回匹配。将其作为一个记录良好的方法“extractSnippet”而不是尝试在单个正则表达式中进行。

答案 1 :(得分: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
    )

)

答案 2 :(得分:1)

Java需要Java.util.regex。* lib(最后一个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中,可以调用常规正则表达式语法。

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

粗略地说,我会首先检查是否存在一个像 $ y 这样的模式来预先形成X.然后用分割操作来计算单词的费用和" "空间分隔符。从那里,它是一个计数问题。

答案 3 :(得分:1)

此代码生成一个包含300个单词的字符串(Word0 ... Word299),定义要搜索的目标"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));
相关问题