static SS matchDollarVarsIC_underscores(S pat, S s) { pcall { if (pat == null || s == null) null; new L vars; S pat2 = dropSuffix("...", dollarVarsToStars_underscoresWithDollarQ(pat, vars)); s = dropSuffix("...", s); new Matches m; if (!match(pat2, s, m)) null; new SS map; int v = 0; for (int i = 0; i < l(m.m); ) { S var = vars.get(v++); bool quoted = startsWith(var, "$_q_"); if (quoted) { S value = m.m[i++]; if (!isQuoted(value)) null; var = "$" + substring(var, 4); if (!strictPutIC(map, var, unquote(value))) null; } else { int n = underscoreWordCount(var); S value = joinWithSpace(subStringArray(m.m, i, i+n)); if (!strictPutIC(map, var, value)) null; i += n; } } ret map; } null; }