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...