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