2016-10-24 5 views
0

私は現在、Stringからの一致を見つけることができる次のコードを持っています。正規表現を先読みしてトークンに変換する

64xに似たすべての単語を見つけてそれらをトークンに分割する必要があるので、64xを出力として取得します。

私は正規表現の先読みを見ましたが、これは問題を解決しません。64xに似たマッチを保存する新しいarraylistを作成せずにこれを行う方法はありますか?

 String input = "Hello world 65x"; 

     ArrayList<String> userInput = new ArrayList<>(); 

     Matcher isMatch = Pattern.compile("[0-9]*+[a-zA-Z]") 
       .matcher(input); 
     while (isMatch.find()) { 
      userInput.add(isMatch.group()); 
     } 
+0

65x' 'そんなに固有のものですか? https://ideone.com/ROcBxXを参照してください。 –

答えて

1

あなたは次の正規表現試すことができます:あなたは非常に頻繁に正規表現を使用する場合は、さらに

\b(\p{Digit}+)(\p{Alpha})\b 

を、それはそれを毎回再コンパイルを避けるために、定数を使用することをお勧めします、例えば:

private static final Pattern REGEX_PATTERN = 
     Pattern.compile("\\b(\\p{Digit}+)(\\p{Alpha})\\b"); 

public static void main(String[] args) { 
    String input = "Hello world 65x"; 
    Matcher matcher = REGEX_PATTERN.matcher(input); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
    } 
} 

出力:

65 
x 
1

先読みの必要がありません、あなたは、ネストされたキャプチャグループを使用することができます。

Matcher isMatch = Pattern.compile("\\b([0-9]+)([a-zA-Z])\\b"); 

グループ#1は65が含まれ、グループ#2がxが含まれています。

あなただけMatcher.group(int)を使用する必要がabc56xyz

1

にマッチするのを避けるためにいずれかの側に\\b(ワード境界)を追加することがベター。これにより、一致するテキストの部分を抽出することができます。グループ化についての詳細はhereをご覧ください。捕捉グループを含む正規表現は、\\b([0-9]+)([a-zA-Z])\\b(anubhavaによって与えられる)です。

関連する問題