2017-10-01 12 views
-1

を満たす単語を示すない正規表現Matcher.findはここ所定の正規表現コード基準

import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 
     String longString = " Derek Banas CA 12345 PA (412)555-1212 [email protected] 412-555-1234 412 555-1234 "; 
     regexChecker("\\s[A-Za-z]{2,20}\\s", longString); 
    } 

    public static void regexChecker(String theRegex, String str2Check){ 
     Pattern checkRegex = Pattern.compile(theRegex);  
     Matcher regexMatcher = checkRegex.matcher(str2Check); 
     while (regexMatcher.find()){ 
      if (regexMatcher.group().length() != 0){ 
       System.out.println(regexMatcher.group().trim()); 
       System.out.println("Start Index: " + regexMatcher.start()); 
       System.out.println("Start Index: " + regexMatcher.end()); 
      } 
     } 
    } 
} 

出力

Derek 
Start Index: 0 
Start Index: 7 
CA 
Start Index: 12 
Start Index: 16 
PA 
Start Index: 21 
Start Index: 25 

1である理由>なぜデレクの出力が「末端でありますインデックス7 'ではなく6?
2>なぜ 'Banas'が出力に含まれないのですか?

ご協力いただければ幸いです。

+0

具体的なヘルプが必要な場合は、具体的な質問をしてください。また、私は2番目の正規表現がスペースなしでマッチを返すので、私の解決策はちょうど必要なものだと思うし、空白の境界をチェックしています(したがって、2文字から20文字の単語しか返しません)。 –

答えて

0

パターンに空白以外の空白文字が含まれています。それはの両方のあなたの質問ののアカウント: "Derek"と "Banas"の間のスペースは、 "Banas"の試合の一部であることを停止する( " Banas "と一致させる)。

\\s\\bに変更すると、スペースを使用しない単語境界に一致します。

Derek 
Start Index: 1 
Start Index: 6 
Banas 
Start Index: 7 
Start Index: 12 
CA 
Start Index: 13 
Start Index: 15 
PA 
Start Index: 22 
Start Index: 24 
johnsmith 
Start Index: 39 
Start Index: 48 
hotmail 
Start Index: 49 
Start Index: 56 
com 
Start Index: 57 
Start Index: 60 

その時点で、あなたはおそらくあなたが望んでいないマッチを得るでしょう。

空白を前面に取り込みますが、最後に空白を取り除くことができます。このようなパターン:

regexChecker("\\s[A-Za-z]{2,20}", longString); 

はの出力を与える:

Derek 
Start Index: 0 
Start Index: 6 
Banas 
Start Index: 6 
Start Index: 12 
CA 
Start Index: 12 
Start Index: 15 
PA 
Start Index: 21 
Start Index: 24 
johnsmith 
Start Index: 38 
Start Index: 48 
+0

「バナナ」とそれ以外の可能性のある試合を見つけるのに他に方法はありますか? – user2769790

+0

あなたが何をしているのかは本当に明確ではありません。正直に言うと。 –

+0

最初は、\\ s [A-Za-z] {2,20} \\ sで可能なすべての一致のリストが必要でした。 しかし、その場合はバナスを返さなかった。 – user2769790

0

パターンは2〜20のASCII文字と空白後、空白と一致します。つまり、最初の試合の最後はDerekの後のスペース、つまり7番目のインデックスです。また、実際Banasを占め

は一致しません:最初の試合は、すでにBanasの前にスペースを消費し、第1 \sは、このように、Banasがスキップされ、Bと一致していません。

あなたは、最後の\s非消費を作る

"\\s[A-Za-z]{2,20}(?!\\S)" 
       ^^^^^^ 

regex demoを参照してください使用する必要があります。

(?!\S)負のルックアヘッドは、空白文字列または文字列の末尾のすぐ後に続く文字列内の位置と一致します。最初の\sと同様の「トリック」を(?<!\S) lookbehindにすると、"(?<!\\S)[A-Za-z]{2,20}(?!\\S)"になることがあります。それで、空白はマッチ値の中に上書きされません。

this regex demoを参照してください。

この問題を解決するもう1つの方法は、の幅のアサーションでもある\bのワード境界を使用することです。