長い文字列変数X
と別の文字列(1〜2語の長さ)がありY
ます。Y
に表示される前後の50語を検索したいX
。正規表現を使用してこれを実現するにはどうすればよいですか。
4 に答える
なぜこれは正規表現でなければならないのですか?一致が文字列の先頭にあるため、周囲に50語がない場合はどうなりますか?
一致するものを見つけて、それを囲む適切な「スニペット」を個別に見つけることを検討してください。すべてを1つの魔法の、保守不可能な正規表現に詰め込もうとはしません。
明示的に行うことには何の問題もありません。一致するものを見つけ、スニペットを目的のサイズに拡大し、一致するものを返します。単一の正規表現で実行しようとするのではなく、十分に文書化されたメソッド「extractSnippet」を作成します。
この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
)
)
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
}
パターンでは、通常の正規表現構文を呼び出すことができます。
y文字列の前後に50以上の単語がない可能性がある問題に遭遇する可能性があると思います。
大まかに言うと、最初に$ yのようなパターンで存在を確認して、Xでプリフォームします。次に、分割操作と""スペース区切り文字を使用して単語をカウントする費用を負担します。そこから、そのカウントの問題。
このコードは、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));