2016-09-06 23 views
2

除く2つのコロンの間の値を取得するには:は正規表現が、私はこのような文字列持つコロン

something:POST:/some/path 

を今私は、文字列からだけではPOSTを取りたいです。私はこの正規表現を使用してこれを行いました

:([a-zA-Z]+): 

しかし、これは私にコロンと一緒に値を与えます。

:POST: 

が、私は同じことを一致し、次のようにそれが交換するこの

POST 

私のコードが必要になります:つまり、私はこれを取得

String ss = "something:POST:/some/path/"; 
Pattern pattern = Pattern.compile(":([a-zA-Z]+):"); 
Matcher matcher = pattern.matcher(ss); 

if (matcher.find()) { 
    System.out.println(matcher.group()); 
    ss = ss.replaceFirst(":([a-zA-Z]+):", "*"); 
} 
System.out.println(ss); 

EDIT:

私はを使用したくないので、lookahead/lookbehind正規表現を使用することに決めましたたとえば、:*:のようなコロンでを入力します。これは私の最終的な解決策です。

String s = "something:POST:/some/path/"; 
String regex = "(?<=:)[a-zA-Z]+(?=:)"; 

Matcher matcher = Pattern.compile(regex).matcher(s); 

if (matcher.find()) { 
    s = s.replaceFirst(matcher.group(), "*"); 
    System.out.println("replaced: " + s); 
} 
else { 
    System.out.println("not replaced: " + s); 
} 
+3

グラブグループ1つの値 - 'matcher.group(1)' –

+0

これは動作します私はマッチャーを印刷します。しかし、私は正規表現を使用して文字列でそれを置き換えることができますか? – v1shnu

+0

両方の方法を示す私の答えを見てください。 –

答えて

2

は二つのアプローチがあります。

  • Javaコードを保持し、かつ使用先読み/後読み(?<=:)[a-zA-Z]+(?=:)、または
  • がで結果を置き換えるためにJavaコードを変更し":*:"

注:正規表現にはStringという定数を定義したいと思うかもしれません。 n回の異なる呼び出し。あなたは、文字列内(?<=:)[a-zA-Z]+(?=:)、正規表現エンジンをチェックそれぞれの場所を使用する場合

String result = s.replaceFirst(":[a-zA-Z]+:", ":*:"); 

Java demo

を参照してください:

+0

はい、これは私が探していたものです。コロンで置き換えるのは良くないので、正規表現で扱いたいと思っていました。 – v1shnu

2

UPDATE

あなたの更新を見て、あなただけのだけReplaceFirstが必要それ以前の*の場合は、見つかったら、1 + ASCII文字に一致するように試み、: afteがあると主張しますそれらのr。 :[A-Za-z]+:では、正規表現エンジンが:という文字列を見つけた後にのみ点検が開始されます。その後、:POST:とマッチした後、置換パターンがマッチ全体を置き換えます。 置き換えパターンのコロンは、正規表現パターンでハードコードされているため、完全にハードコードすることができます。

オリジナル答え

あなただけのグループ1にアクセスする必要があります。

if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Java demo

あなた:([a-zA-Z]+):正規表現はキャプチャグループ含ま見る((....)サブパターンを参照してください)。これらのグループは自動的に番号が付けられます:最初のものは1率を有する、第二は、2のインデックスを持っている、など

それを置き換えるには、Matcher#appendReplacement()を使用します。

String s = "something:POST:/some/path/"; 
StringBuffer result = new StringBuffer(); 
Matcher m = Pattern.compile(":([a-zA-Z]+):").matcher(s); 
while (m.find()) { 
    m.appendReplacement(result, ":*:"); 
} 
m.appendTail(result); 
System.out.println(result.toString()); 

は通りanother demo

+1

これは印刷に適しています。しかし、私は推測して交換するためではありません。 – v1shnu

+0

変数に割り当てることができます。それを置き換えるには、 'Matcher#appendReplacement'を使うべきです。 –

+0

実際にはカッコをパターンから完全に削除することができます。なぜなら、コロンで開始と終了がコロンで終わり、内側にあるものはドロップされて '*'に置き換えられるからです。 –

2

を参照してください。指摘されたreqex捕獲されたグループを使用して、置き換えることができる。これはあなたのソリューションです

String ss = "something:POST:/some/path/"; 
    Pattern pattern = Pattern.compile(":([a-zA-Z]+):"); 
    Matcher matcher = pattern.matcher(ss); 

    if (matcher.find()) { 
     ss = ss.replaceFirst(matcher.group(1), "*"); 
    } 
    System.out.println(ss); 
1

正規表現= (:)([a-zA-Z]+)(:)

、コードは次のとおりです。

String ss = "something:POST:/some/path/"; 

ss = ss.replaceFirst("(:)([a-zA-Z]+)(:)", "$1*$3"); 

ssは今含まれています

次のコードは、それをやりました

何か:*:/いくつかの/パス/

私はあなたが探しているものであると信じて...

関連する問題