2016-07-17 2 views
0

JAVAで正規表現を使用して文字列の特定の部分を取得する方法がわかりません。私は"APPLICATION NAME"と呼ばれる文字列の一部を取得する必要がありJava - 正規表現特定の単語の前後の文字に分割する

application.APPLICATION NAME.123456789.status 

:ここに私の入力文字列です。 APPLICATION NAME自体にピリオドが含まれている可能性があるため、ピリオド文字に分割することはできません。最初の単語、"application」、常に同じままと"APPLICATION NAME"後の文字は常に数字になります。

私は期間に分割し、第一インデックスをつかむことができましたが、私が述べたように、APPLICATION NAME自体がピリオドを含むことができ私はまた、期間の最初と最後のインデックスをつかむことができましたが、これは不便だと思われ、REGEXを使用して将来的に証明したいと考えています。

私は数時間ありがとう!

+0

あなたが使用しました正規表現:

はパターンは、より厳しく、常に全体の入力と一致する(置き換え)しますオプションを使用して一致しない場合は、空白を返すことによって、「悪い」の入力を処理するには?どのように 'status'を書くことができますか? 'status'の後には何かがありますか? – horcrux

+0

最後のプロパティ(この場合はstatus)は動的ですが、常に1つの単語で、ピリオド(例: ".status"、 ".expiration"、 ".whatever")が前に付いています。私はこれまでこれを試しました: 'String appName = key.split(" \\。 ")[1];' – sags

答えて

1

find()を使用して

サンプルコード:

private static void test(String input) { 
    String regex = "^application\\.(.*)\\.\\d"; 
    Matcher m = Pattern.compile(regex).matcher(input); 
    if (m.find()) 
     System.out.println(input + ": Found \"" + m.group(1) + "\""); 
    else 
     System.out.println(input + ": **NOT FOUND**"); 
} 
public static void main(String[] args) { 
    test("application.APPLICATION NAME.123456789.status"); 
    test("application.Other.App.Name.123456789.status"); 
    test("application.App 55 name.123456789.status"); 
    test("application.App.55.name.123456789.status"); 
    test("bad input"); 
} 

出力上記の "状態" である限り動作します

application.APPLICATION NAME.123456789.status: Found "APPLICATION NAME" 
application.Other.App.Name.123456789.status: Found "Other.App.Name" 
application.App 55 name.123456789.status: Found "App 55 name" 
application.App.55.name.123456789.status: Found "App.55.name" 
bad input: **NOT FOUND** 

は数字で起動しません。

+0

Andreasありがとう、これは美しく動作します。 m.group(1)が動作する前に、私がm.find()を使用することを義務付けられているように思われます。そうでなければ、例外がスローされます。私はちょっと奇妙に思える。 – sags

0

split()とすると、の中にkey.split("\\.")を保存することができますと、2回目にs[1]からs[s.length-3]に参加します。正規表現で

あなたが行うことができます:あなたはmatches()find()^application\.(.*)\.\d、またはapplication\.(.*)\.\d.*を使用することができます

String appName = key.replaceAll("application\\.(.*)\\.\\d+\\.\\w+")", "$1"); 
+0

'' \ ''を二重にしていないのを忘れました。 $ ' – Andreas

+0

ありがとうございます! – horcrux

+0

'。*?'(less is more)の 'application'を変更することもできます。 – Bohemian

0

なぜ分割されますか?ジャスト:

String appName = input.replaceAll(".*?\\.(.*)\\.\\d+\\..*", "$1"); 

また、これは正しく、アプリケーション名内の、その後の桁のドットを処理していますが、入力が予想される形式である知っている場合にのみ正しく動作します。

String appName = input.replaceAll("^application\\.(.*)\\.\\d+\\.\\w+$|.*", "$1"); 
+0

'? '、つまり'(。*) 'を削除しない限り、アプリケーション名内のドットを正しく扱い、数字を*処理しません。入力 'application.App.55.name.123456789.status'に対しては、'? 'を付けずに' App.55.name'を取得し、 '?'を使って 'App'だけを取得します。 – Andreas

+0

@アンドレアスええ、OK – Bohemian

関連する問題