2012-05-02 21 views
4

文を含む文字列があり、単語に基づいて半分に分割したい。 私は正規表現(\\w+) wordを持っています。これは "単語" + "単語"自体の前にすべての言葉を得て、最後の4文字を取り除くことができます。Java Regex - 文字列の部分文字列の前にあるすべての単語を取得する

しかし、これはうまくいかないようです...私が間違っていたことは何ですか?

ありがとうございました。

+0

コードを終了するには、問題を記述し、より便利です。 – twain249

+0

貪欲でない修飾子「+?代わりに '+' –

+1

「これはうまくいかないようです」何が起こるのですか?あなたは何をしたいですか? – erickson

答えて

7

これは動作するようです:

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()); 
     } 
    } 
} 
3

単語の前後に文の各部分をトークン化したいと思うでしょう。

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]); 
+0

必要に応じて私の例を展開するのを助けることができましたが、見た目が素早く見えるのは、文のセクションが配列に格納されていて、文を壊す – Chad

0

理由は+は貪欲数量詞で、バック与えることなく、指定した単語を含む全体の文字列と一致するということです。

(\\w+?) wordに変更するとうまくいくはずです。量子とその正確な関数の詳細についてはhereを参照してください。

+0

'+'は貪欲ですが、バックトラッキングが可能です。その等価物は '++' – erickson

+0

です。それで、私は決して実際に量詞を考え出したことはありません。私はあなたが実際に正規表現のどこと何を指定することを意味するバックトラッキングと思いますか?一方、入力文字列には探していた「単語」が含まれているので、消極的に2つのマッチが自動的に見つかります。 – MarioDS

+1

バックトラックすると、「\\ w + \ w」という表現が「xy」にマッチします。マッチャーは "\\ w"と "xy"をマッチさせ、2番目の "\\ w"にマッチするものが残っていないことを認識します。したがって、「\\ w +」と「x」をマッチさせ、「\\ w」を「y」とマッチさせてバックトラックします。 – erickson

5

使用して文字列操作:

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); 
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()); 
     } 
    } 
} 

次のように分類されます。

。*?すべて

(?=

単語

前)

+0

コードの書式はありません。Javaではなく、動作しません。 – MarioDS

+0

ああ、愚かな試みはうまくいっている:)私はここで失礼ではない、私は事実を言っている... – MarioDS

+0

質問は正規表現そのものに関するものであったので、私はすでに彼が表現をコンパイルする方法を知っていると思うだろう。私は表現を与え、それを分割して、各セクションが何をしているのかを示しました。私は将来的に説明的になるようにしようとしています。 –

関連する問題