title: Java regex (?i) vs Pattern.CASE_INSENSITIVE
body: <p>I'm using <code>"\\b(\\w+)(\\W+\\1\\b)+"</code> along with <code>input = input.replaceAll(regex, "$1");</code> to find duplicate words in a string and remove the duplicates. For example the string input = "for for for" would become "for". </p>
  
  <p>However it is failing to turn "Hello hello" into "Hello" even though I have used  <code>Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);</code></p>
  
  <p>I can correct it by using <code>"(?i)\\b(\\w+)(\\W+\\1\\b)+"</code> but I want to know why this is necessary? Why do I have to use the (?i) flag when I have already specified Pattern.CASE_INSENSITIVE?</p>
  
  <p>Heres the full code for clarity:</p>
  
  <pre><code>import java.util.Scanner;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  public class DuplicateWords {
  
  public static void main(String[] args) {
  
      String regex = "\\b(\\w+)(\\W+\\1\\b)+";
      Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  
      Scanner in = new Scanner(System.in);
      int numSentences = Integer.parseInt(in.nextLine());
  
      while (numSentences-- &gt; 0) {
          String input = in.nextLine();
  
          Matcher m = p.matcher(input);
  
          // Check for subsequences of input that match the compiled pattern
          while (m.find()) {
              input = input.replaceAll(regex, "$1");
          }
  
          // Prints the modified sentence.
          System.out.println(input);
      }
      in.close();
  }
  }
  </code></pre>