2015-12-16 15 views
6

JavaのRegexを使って特定の文字列を抽出したいと思います。私は現在このパターンを持っています:正規表現でJavaの文字列の先頭と末尾を一致させる

pattern = "^\\a.+\\sed$\n"; 

"a"で始まり "sed"で終わる文字列に一致すると考えられます。これは動作していません。私は何か見落としてますか ?

パターンの最後の\ n行を削除し、 "$"で置き換えました。 まだ一致しません。正規表現は私の側から正当に見えます。

私が抽出したいのは、一時文字列からの "sed"です。

String temp = "afsgdhgd gfgshfdgadh a sed afdsgdhgdsfgdfagdfhh"; 
       pattern = "(?s)^a.*sed$"; 
         pr = Pattern.compile(pattern); 

       math = pr.matcher(temp); 
+0

はこれを試すの '^a。* sed $ ' – nafas

+0

は、あなたが探しているものとまったく同じです。 – nafas

答えて

3

あなたがased間の唯一の空白がある場合は、a\\s+sedを使用できるように、a sedをマッチさせたいUPDATE

String s = "afsgdhgd gfgshfdgadh a sed afdsgdhgdsfgdfagdfhh"; 
Pattern pattern = Pattern.compile("a\\s+sed"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

今すぐIDEONE demo

を参照してください、 鍛え貪欲トークン使用し、asedができる場合:

Pattern pattern = Pattern.compile("(?s)a(?:(?!a|sed).)*sed"); 
             ^^^^^^^^^^^^^ 

another IDEONE demoを参照してください。

ORIGINAL ANSWER

あなたの正規表現の主な問題は、最後に\nです。 $は文字列の終わりであり、文字列の終わりの後に1文字以上の文字をマッチさせることはできませんが、これは不可能です。また、\\sは空白記号と一致しますが、リテラルsが必要です。

あなたが改行にマッチ\\ sおよび\nを削除し、.を行う必要があり、また、できるように*数量詞を使用するadvisbaleで0シンボルで-間:

pattern = "(?s)^a.*sed$"; 

See the regex demo

正規表現は次のとおりです。

  • ^ - 文字列の先頭
  • a - リテラルa
  • .*から0以上の任意の文字
  • sed(?s)修飾子は.マッチ改行を含む任意の文字になりますので) - リテラル文字列をsed
  • $ - 文字列の末尾
+0

https://regex101.com/r/lY3qD0/1をご覧ください。 –

+0

更新をご確認ください。私はソリューションの1つがあなたのために働くはずだと思います。 –

+0

タブがある場合、またはスペースしかない場合は、これは機能しますか?ありがとうございました! "文字の始まり"と "文字の終わり"に一致する一般的な正規表現は存在しないのでしょうか? –

1

temp文字列がpatteに一致しませんこのパターンは、あなたのtemp文字列シーケンスで文字エンドでを開始しなければならないことを言うので、(?s)^a.*sed$ rnはそうではありませんこれは、をsedの。あなたの文字列は "sed"シーケンスの後に後ろの文字を持っています。 あなただけを抽出したい場合はその... sedの文字列全体の部分は、「* sedの。」アンカーされないパターンを使用して試してみて、Matcher classfind()方法を使用します。

Pattern pattern = Pattern.compile("a.*sed"); 
Matcher m = pattern.matcher(temp); 
if (m.find()) 
{ 
    System.out.println("Found string "+m.group()); 
    System.out.println("From "+m.start()+" to "+m.end()); 
} 
関連する問題