Skip to main content
2 of 2
Relevant added explanation

Rust, 117 91 bytes

Requires inputs to be lowercased and it might break horrendously on multibyte characters as per the challenge's allowances. Officially only supports single-byte character input.

|s:&str|s.split(' ').any(|w|w.starts_with("ill")&&(w.len()<4||!"aiouy".contains(&w[3..4])))

Ungolfed and explained:

// Non-regex answer; unless depending on flavor-specific behavior, 
// there's two regex answers already, they're just tagged as JS (ES6)
fn sick(album: &str) -> bool {
  // Rely on implicit returns
  album
    .split(' ') // split on literal space and iterate over the words
    .any(|word| // Check if any of the splits match a predicate
      word.starts_with("ill") // explains itself
      && (
        word.len()<4 // "ill" is the whole word, sick
        // OR the title does not match the pattern of false positives
        || !"aiouy".contains(&w[3..4]) // so it's sick
        // Rust doesn't allow byte indexing of strings, as some indices
        // may not be whole characters, it does allow indexing ranges
        // So this is effectively &w[3], but it panics if the char at
        // this position happens to be more than one byte long
      )
    )
}

Rust Playground link