2016-09-16 13 views
0

私はこの質問をしばらく前に聞いてきましたが、適切な答えを得られなかったので別のショットを付けました。Javaで正規表現を使用して一致することができません

class Test { 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     String file_name = "C:\\Temp\\Test.txt"; 
     String string = FileUtils.readFileToString(new File(file_name), "UTF-8"); 
     String regex = "^(ipv6 pim(?: vrf .*?)? rp-address .*)"; 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(string); 
     if (matcher.find()) { 
      System.out.println("Matcher: " + matcher.group(1)); 
     } else { 
      System.out.println("No Matches"); 
     } 
    } 
} 

ファイルには、750を超える多くの行が含まれていますね。正規表現の値と一致するすべての行を抽出したいと思います。今問題は、私がコードを行った方法は、一致するものを返しません。私は、ファイルの最初の行が正規表現と一致していれば何もしません。私はすべてが新しい行にあるので、問題を引き起こしていると思った。しかし、文字列を単一の行に変換するコードを書くことさえ、パターンが最初に一致しない場合は値を返しません。

サンプル一致する文字列:のIPv6のPIM RPアドレス20:20:20 :: F

+0

あなたの正規表現は機能しません。それを[RegExr](http://www.regexr.com)でテストするとそれが証明されます。 '(ipv6 \ spim \ srp-address \ s([\ d] {2}:)+ :.)' –

+0

私はそれをテストしました。複数行モード(下記参照)を使用している場合や、すべてのテキストを1行に入れる場合は、先頭の '^'(Begin of Line)が問題になる可能性があります。 – CoronA

+0

@CoronAそうですね。問題は主導です^ –

答えて

1

代わりの場合は条件を使用して、それを切り替えますwhileループ。 一致する値の

while (matcher.find()) { 
    System.out.println("Matcher: " + matcher.group(1)); 
} 

find()検索。次のコードを取得するには、再度find()を呼び出す必要があります。

さらに、^は、その後の検索がstarting withの条件と一致しないため、もう一度&と一致することを防ぎます。したがって、^を削除することがあります。

また、Ramblerが示唆しているように、Pattern.MULTILINEフラグを使用することもできます。これにより、^が文字列全体の先頭に1回ではなく、改行の始めに確実に使用されます。

2

MULTILINE修飾子を与えてみてください。

Pattern p = Pattern.compile(regex, Pattern.MULTILINE); 
+0

残念ながら運はありません! :( –

+0

ありがとうございますVineet/Rambler、2つのソリューションを組み合わせて働いた!:) 恐ろしい! –

関連する問題