2017-02-11 9 views
-1

一緒に見つかった2つの単語の後にすべてを削除する必要があります。類似の質問を探してみよう文字列 "foo bar"の後にすべてを削除する正規表現

str.replaceAll("foo bar(.*)", "") 

最初の行だけを削除しているようです。

$を正規表現の末尾に追加すると(foo bar。* $ )、何も選択しないようですか?なぜどんなアイデア?

ありがとう

答えて

1

それは2つの単語を見つけるのと同じくらい簡単だ場合、あなたはそれらを見つけるためにindexOfを使用することができ、その後、 substringを使用して文字列をトリミングし、2つの単語の後のすべてを削除します。

String keyWord = "key word"; 
String input = "some\ntext\nkey word is here\nand more text\nto follow"; 
int pos = input.indexOf(keyWord); 
if (pos != -1) { 
    String trimmed = input.substring(0, pos + keyWord.length()); 
    System.err.println("'" + trimmed + "'"); 
} 

上記のコードでは、キーワードを維持したいと仮定しています。もしそれを残したくなければ、+ keyword.length()substringにドロップしてください。

正規表現を使用する場合は、Pattern.DOTALLフラグを渡して、ドットマッチラインの終端を設定します。また、あなたは残しておきたいものをキャプチャするために正規表現を変更する必要はなく、あなたが(あなたの例がそれを持っているとして)破棄したいもの:

String keyWordRegex = "key\\s+word"; 
Pattern pattern = Pattern.compile("(.*\\b" + keyWordRegex + "\\b).*", Pattern.DOTALL); 
Matcher matcher = pattern.matcher(input); 
String replaced = matcher.replaceAll("$1"); 
System.err.println("'" + replaced + "'"); 

正規表現は次のように動作します。

  • まず、
  • それが唯一の「キーワード」ではなく、その後「MASTERKEY単語」
  • あなたのキーと一致しないように、ワード境界その後、無限回(スター)
  • には何も(ドット)がゼロをキャプチャするキャプチャを開始するためにブレースを開きます語彙X、この例では、私は(\ s)は、それが「キー」、一つ以上(プラス)、スペースにすること、そして「言葉」
  • ワード境界再び
  • キャプチャグループを閉じます(任意の番号を許可しますスター)の文字(ドット)
+0

正規表現マッチは、インデックス付きバージョンと同じ方法で使用できます。一致のインデックスとその長さを取得してから、前と同じように切り捨てを行うことができます。それはおそらく、正規表現をもっと複雑にするよりも優れています。 –

0

正規表現を使用する必要はありません。簡単な文字列操作の概念を使用することができます。

String str = "testing test foo bar test foo bar test \n testing all \n foo bar(.*) tester"; 

     String boundaryValueText = "foo bar"; 
     int boundaryValueIndex = str.indexOf(boundaryValueText); 
     String parsedContent = boundaryValueIndex != -1 ? new StringBuilder(str) 
       .delete(boundaryValueIndex + boundaryValueText.length(), str.length()).toString() : str; 
+0

おかげで、例のマルチラインのサポートを追加..Will。 –

+0

動作しない入力を提供できますか? –

+0

私はString str = "foo bar(。*)test foo bar(。*)test \ nすべてのfoo bar(。*)テスターをテストしました。とその働き。 –

1

フラグ?sを用いSingle Line Modeマッチングを使用します。

str = str.replaceAll("(?s)foo bar(.*)", "");

正規表現を使用することは必須ではありません場合は、単に次のように使用することができます。

str = str.indexOf("foo bar") == -1 ? str : str.substring(0, str.indexOf("foo bar"));

1

あなたは以下の解決策を試すことができます。 foo barの後にすべての文字が削除されています。

String a = "hell fdshf fdfjk foo bar ffsd fsajkh vsfdsv" ; 
String as = a.split("foo bar")[0]; 
System.out.println(as); 

出力

hell fdshf fdfjk

+0

こんにちはchirag、あなたの答えは最高です。 –

関連する問題