0

重複の可能性:
正規表現がフレーズ内のサブワードと一致しません

私のプログラムは一致する結果を表示しますが、結果を完全一致(100%)、半一致などとして並べ替えたいと思います。私のテキストファイルには次の行が含まれています。

  1. 赤い車

  2. 車両

だから私が検索した場合:「赤い車」。次の結果が得られます

  1. 赤い車

  2. 車両

だから私がしたいのは、見つかった結果を次のように並べ替えることです。

  1. 「赤い車」100%マッチ

  2. 「赤」40%一致

  3. 「車」40%一致

どんな助けでも大歓迎です。

どんな助けでも大歓迎です。私のコードは次のとおりです。

public static void main(String[] args) {
  // TODO code application logic here
  String strLine;
  try{
    // Open the file that is the first 
    // command line parameter   
    FileInputStream fstream = new FileInputStream("C:\\textfile.txt"");
    // Get the object of DataInputStream
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    Scanner input  = new Scanner (System.in);         
    System.out.print("Enter Your Search:  ");   // String key="red or yellow";
    String key = input.nextLine();

    while ((strLine = br.readLine()) != null) {     
      Pattern p = Pattern.compile(key); // regex pattern to search for
      Matcher m = p.matcher(strLine);  // src of text to search
      boolean b = false;
      while(b = m.find()) {                       
        System.out.println( " " + m.group()); // returns index and match
        // Print the content on the console
      }
    }
    //Close the input stream
    in.close();              
  }catch (Exception e){//Catch exception if any
    System.err.println("Error: " + e.getMessage());
  }
}  
4

1 に答える 1

0

「Red」または「Yellow」を検索していて、必要な論理演算子が or だけで (「and」または「xor」は不要)、検索対象にワイルドカードや正規表現を使用したくないとします。 for の場合は、単純にループして、各文字列を順番に行に一致させようとします。疑似コードでは、次のようになります。

foreach (thisLine: allLinesInTheFile) {
    numOfCharsMatching = 0
    foreach (thisString: allSearchStrings) {
         if (thisLine.contains(thisString) {
               numOfCharsMatching = numOfCharsMatching + thisString.length
         }
    }
    score = ( numOfCharsMatching / thisLine.length ) * 100
}

スコアでスペースをカウントしたくない場合は、thisString.length からスペースを削除する必要があります (検索用語でスペースを許可しないでください)。

もう1つの問題は、一致が重複する可能性がある場合、numOfCharsMatchingが正しくないことです(つまり、「row」または「brown」を「brown row」で検索すると、文字列の長さよりも長い11文字が一致していると表示されます。 BitSet を使用して、マッチに関与したキャラクターを追跡します。たとえば、次のようになります。

foreach (thisLine: allLinesInTheFile) {
    whichCharsMatch = new BitSet()
    foreach (thisString: allSearchStrings) {
         if (thisLine.contains(thisString) {
               whichCharsMatch.set(startPositionOfMatch, endPositionOfMatch, true)
         }
    }
    score = ( numOfCharsMatching / thisLine.length ) * 100
}

BitSet javadoc、特に set メソッドと cardinality メソッドを見てください。

于 2012-11-07T18:13:44.053 に答える