Javascript Regex для всех слов не между определенными символами

Я пытаюсь вернуть счет всех слов НЕ между квадратными скобками. Так что дано.

[don't match these words] but do match these

Я получаю счет 4 для последних четырех слов.

Это работает в .net:

\b(?<!\[)[\w']+(?!\])\b

но он не будет работать в Javascript, потому что он не поддерживает lookbehind

Любые идеи для чистого js-регулярного решения?

Ответ 1

Хорошо, я думаю, это должно сработать:

\[[^\]]+\](?:^|\s)([\w']+)(?!\])\b|(?:^|\s)([\w']+)(?!\])\b

Вы можете протестировать его здесь:
http://regexpal.com/

Если вам нужна альтернатива с текстом в квадратных скобках, идущим после основного текста, его можно добавить в качестве второй альтернативы, а вторая вторая станет третьей.
Это немного сложно, но сейчас я не могу придумать лучшего решения.

Если вам нужно что-то сделать с фактическими совпадениями, вы найдете их в группах захвата.

UPDATE:

Объяснение: Итак, у нас есть два варианта:

  • \[[^\]]+\](?:^|\s)([\w']+)(?!\])\b

Это говорит:

  • \[[^\]]+\] - сопоставить все в квадратных скобках (не записывать)
  • (?:^|\s) - после начала строки или пробела - когда я смотрю на него, теперь вынимайте каретку, так как это не имеет смысла, поэтому это станет просто \s
  • ([\w']+) - сопоставлять все следующие словарные символы, пока (?!\]) следующий символ не является закрывающей скобкой - ну, вероятно, теперь это тоже не нужно, поэтому попробуйте и удалите lookahead
  • \b - и соответствовать границе слова

2 (?:^|\s)([\w']+)(?!\])\b

Если вы не можете найти вариант 1 - выполните только сопоставление слов, не глядя на квадратные скобки, поскольку мы гарантировали, что первая часть не будет здесь.

Хорошо, поэтому я удалил все, что нам не нужно (они остались там, потому что я пробовал несколько вариантов, прежде чем он сработал:-), а исправленное регулярное выражение - следующее:

\[[^\]]+\]\s([\w']+)(?!\])\b|(?:^|\s)([\w']+)\b

Ответ 2

Я бы использовал что-то вроде \[[^\]]*\], чтобы удалить слова между квадратными скобками, а затем взорвать пробелы возвращенной строкой, чтобы подсчитать оставшиеся слова.

Ответ 3

Крис воскресил этот вопрос, потому что у него было простое решение, о котором не упоминалось. (Нашел ваш вопрос, проведя некоторое исследование для общего вопроса о как исключить шаблоны в regex.)

Здесь наше простое регулярное выражение (см. его в работе в regex101, глядя на группу в нижней правой панели):

\[[^\]]*\]|(\b\w+\b)

Левая часть чередования соответствует завершению [bracketed groups]. Мы проигнорируем эти матчи. Правая сторона сопоставляет и захватывает слова в группу 1, и мы знаем, что они правильные слова, потому что они не соответствовали выражению слева.

В этой программе показано, как использовать регулярное выражение (см. результат подсчета в онлайн-демонстрация):

<script>
var subject = '[match ye not these words] but do match these';
var regex = /\[[^\]]*\]|(\b\w+\b)/g;
var group1Caps = [];
var match = regex.exec(subject);

// put Group 1 captures in an array
while (match != null) {
    if( match[1] != null ) group1Caps.push(match[1]);
    match = regex.exec(subject);
}


document.write("<br>*** Number of Matches ***<br>");
document.write(group1Caps.length);

</script>

Ссылка

Как сопоставить (или заменить) шаблон, за исключением ситуаций s1, s2, s3...