2017-10-12 20 views
1

セミコロン(;)とWORDの間でテキストを抽出しようとしています。私は以下のコードを使用していますが、以下のコードを使用して "TVS A3003"を抽出することはできません。以下の間でサブストリングを抽出します。java内のregexを使用してjava内のWORD

Matcher matcher = Pattern.compile("(?<=;).*?(?=WORD)").matcher(string); 

3つのサンプル文字列:

1. (XYZTRR: KTTT 4.0.1; TVS A3003 WORD/LLLLL ; pj ;) 

2. (XcdcdRR; dTff 5.4.1; TVS A3003 WORD/UJH;KKKHH fpp) 

3. LLLhf22; 776332 8.7.1; TVS A3003 WORD/UHHGFVV phhp 

4. (;LLLhf22; 776332 8.7.1; TVS A3003 WORD/UHHGFVV phhp ;) 

私はすべてのケースでTVS A3003を抽出したいです。

+1

郵便いっぱい関連するコード。何がうまくいかない? –

+0

正確な質問の答えは –

+0

@WiktorStribiżewこんにちは、あなたが共有しているリンクは3番目のサンプルでは失敗し、 "776332 8.7.1; TVS A3003"として出力しています –

答えて

1

です。あなたはそれを使用することがあります

;([^;]*?)WORD 

regex demoを参照してください。先頭/末尾の空白は、一致が見つかった後に.trim()で簡単に削除できます。

は、以下のJava demoを参照してください。

List<String> strs = Arrays.asList("(XYZTRR: KTTT 4.0.1; TVS A3003 WORD/LLLLL ; pj ;)", 
     "(XcdcdRR: dTff 5.4.1; TVS A3003 WORD/UJHKKKHH fpp)", 
     "(LLLhf22; 776332 8.7.1; TVS A3003 WORD/UHHGFVV phhp));"); 
Pattern pattern = Pattern.compile(";([^;]*?)WORD"); 
while (String s : strs) { 
    Matcher matcher = pattern.matcher(s); 
    if (matcher.find()){ 
     System.out.println(matcher.group(1).trim()); 
    } 
} 

出力:

TVS A3003 
TVS A3003 
TVS A3003 
+0

ありがとうWiktor。上記の正規表現は、3つのサンプルすべてに対して機能しています。 4番目のサンプル文字列の正規表現を提案できますか? –

+0

@MohitAgrawal [私の答えと同じです](https://regex101.com/r/q6A7TC/2) –

+0

@MohitAgrawal第4番目と他の3つの文字列に違いはありません。[Javaのデモ] (https://ideone.com/FLGbcI)。 –

0

REG exはあなたが;を見つけ、その後、WORDが最初に出現するまでのできるだけ少ない;以外の任意の0+文字を一致させる必要が(?<=KTTT 4\.0\.1;)(.*)(?= WORD/U)

Matcher matcher = Pattern.compile("(?<=KTTT 4\\.0\\.1;)(.*)(?= WORD/U)").matcher(string); 

if(matcher.find()){ 
    System.out.println(matcher.group()); 
} 
関連する問題