Joh*_*rak 22

"a".replaceAll("a*", "b")
Run Code Online (Sandbox Code Playgroud)

首先替换ab,然后将指针推进过去b.然后它匹配字符串的结尾,并替换为b.由于它匹配一个空字符串,它会使指针前进,掉出字符串,然后完成,从而产生bb.

"a".replaceAll("a*?", "b")
Run Code Online (Sandbox Code Playgroud)

首先匹配字符串的开头并替换为b.它不匹配a,因为?a*?来"非贪婪"(匹配尽可能少).由于它匹配一个空字符串,它会使指针前进,跳过a.然后它匹配字符串的结尾,替换b和掉出字符串,导致bab.最终结果与您的结果相同"a".replaceAll("", "b").


Qta*_*tax 5

这是因为零宽度匹配.


"a".replaceAll("a*", "b")
Run Code Online (Sandbox Code Playgroud)

将匹配两次:

  1. 尝试在字符串的开头匹配,贪婪*消耗a作为匹配.
  2. 前进到字符串中的下一个位置(现在在字符串的末尾),尝试匹配,空字符串匹配.

    " a "
     \| \___ 2. match empty string
      \_____ 1. match "a"
    
    Run Code Online (Sandbox Code Playgroud)


"a".replaceAll("a*?", "b")
Run Code Online (Sandbox Code Playgroud)

也将匹配两次:

  1. 尝试在字符串的开头匹配,非贪婪*?匹配空字符串而不消耗a.
  2. 前进到字符串中的下一个位置(现在在字符串的末尾),尝试匹配,空字符串匹配.

    " a "
     \  \___ 2. match empty string
      \_____ 1. match empty string
    
    Run Code Online (Sandbox Code Playgroud)