文を含む文字列があり、単語に基づいて半分に分割したい。 私は正規表現(\\w+) word
を持っています。これは "単語" + "単語"自体の前にすべての言葉を得て、最後の4文字を取り除くことができます。Java Regex - 文字列の部分文字列の前にあるすべての単語を取得する
しかし、これはうまくいかないようです...私が間違っていたことは何ですか?
ありがとうございました。
文を含む文字列があり、単語に基づいて半分に分割したい。 私は正規表現(\\w+) word
を持っています。これは "単語" + "単語"自体の前にすべての言葉を得て、最後の4文字を取り除くことができます。Java Regex - 文字列の部分文字列の前にあるすべての単語を取得する
しかし、これはうまくいかないようです...私が間違っていたことは何ですか?
ありがとうございました。
これは動作するようです:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("([\\w\\s]+) word");
Matcher m = p.matcher("Could you test a phrase with some word");
while (m.find()) {
System.err.println(m.group(1));
System.err.println(m.group());
}
}
}
単語の前後に文の各部分をトークン化したいと思うでしょう。
http://docs.oracle.com/javase/1.5.0/docs/api/
String[] result = "this is a test".split("\\s"); //replace \\s with your word
for (int x=0; x<result.length; x++)
System.out.println(result[x]);
必要に応じて私の例を展開するのを助けることができましたが、見た目が素早く見えるのは、文のセクションが配列に格納されていて、文を壊す – Chad
理由は+
は貪欲数量詞で、バック与えることなく、指定した単語を含む全体の文字列と一致するということです。
(\\w+?) word
に変更するとうまくいくはずです。量子とその正確な関数の詳細についてはhereを参照してください。
'+'は貪欲ですが、バックトラッキングが可能です。その等価物は '++' – erickson
です。それで、私は決して実際に量詞を考え出したことはありません。私はあなたが実際に正規表現のどこと何を指定することを意味するバックトラッキングと思いますか?一方、入力文字列には探していた「単語」が含まれているので、消極的に2つのマッチが自動的に見つかります。 – MarioDS
バックトラックすると、「\\ w + \ w」という表現が「xy」にマッチします。マッチャーは "\\ w"と "xy"をマッチさせ、2番目の "\\ w"にマッチするものが残っていないことを認識します。したがって、「\\ w +」と「x」をマッチさせ、「\\ w」を「y」とマッチさせてバックトラックします。 – erickson
使用して文字列操作:
int idx = sentence.indexOf(word);
if (idx < 0)
throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, idx);
使用正規表現:また
Pattern p = Pattern.compile(Pattern.quote(word));
Matcher m = p.matcher(sentence);
if (!m.find())
throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, m.start());
:
Pattern p = Pattern.compile("(.*?)" + Pattern.quote(word) + ".*");
Matcher m = p.matcher(sentence);
if (!m.matches())
throw new IllegalArgumentException("Word not found.");
String before = m.group(1);
はこれを試してみてください:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("^.*?(?= word)");
Matcher m = p.matcher("Everything before the word");
while (m.find()) {
System.out.println(m.group());
}
}
}
次のように分類されます。
。*?すべて
(?=
単語
前)
コードを終了するには、問題を記述し、より便利です。 – twain249
貪欲でない修飾子「+?代わりに '+' –
「これはうまくいかないようです」何が起こるのですか?あなたは何をしたいですか? – erickson