альтернатива regex lookbehind для парсера (js)

Доброе утро

(Я видел, что в этой теме МНОГО ответов, но я не смог найти ни одного подходящего)

Я пишу небольшой парсер на javascript, который бы разрезал текст на такие разделы:

var tex = "hello   this :word is apart"

var parsed = [
  "hello",
  "   ",
  "this",
  " ",
  // ":word" should not be there, neither "word"
  " ",
  "is",
  "apart"
]

идеальное регулярное выражение для этого:

/((?!:[a-z]+)([ ]+|(?<= |^)[a-z]*(?= |$)))/g

Но у него есть положительный взгляд назад, который, как я читал, был реализован в javascript только в 2018 году, поэтому я предполагаю, что у него много конфликтов совместимости с браузерами ... и я бы хотел, чтобы у него был хотя бы небольшая совместимость ...

Я считал :

  • пытается захватить группы (? :), но он занимает пространство до ...
  • просто удалите пробелы, но ": word" будет заменено словом "word"
  • разобрать текст 2 раза, один для слов, другой для пробелов, но я боюсь, что разместить их в правильном порядке будет сложно

Поймите, МНЕ НУЖНЫ слова И ВСЕ пробелы, а некоторые слова исключить. Я открыт в других методах, например, не использую регулярное выражение.

мой последний вариант:

удаление пробелов - проверка и организация всего моего регулярного выражения в правильном порядке, молясь, чтобы ": word" хранилось в группе "специальные слова" прежде всего.

мой вопрос:

будет ли это работать в javascript и быть надежным?

Я пытался

/(((:[a-z]+)|([ ]+)|([a-z]*))/g

в https://regexr.com/, похоже, работает, будет ли это работать в каждом случае?


person gui3    schedule 17.11.2018    source источник
comment
У вашего второго регулярного выражения слишком много левых круглых скобок.   -  person Poul Bak    schedule 17.11.2018
comment
Согласен, это было для групп, но не знаю, стоит ли оно того   -  person gui3    schedule 17.11.2018


Ответы (2)


Вы сказали, что открыты для решений без регулярных выражений, но я могу дать вам одно, которое включает и то, и другое. Поскольку вы не можете полагаться на поддержку ретроспективного просмотра, просто захватите все и отфильтруйте то, что вам не нужно, слова, за которыми следует двоеточие.

const text = 'hello   this :word is apart';
const regex = /(\w+)|(:\w+)|(\s+)/g;
const parsed = text.match(regex).filter(word => !word.includes(':'));

console.log(parsed);

person AnonymousSB    schedule 17.11.2018
comment
большое спасибо ! именно то решение, над которым я работал, но намного проще. - person gui3; 17.11.2018
comment
и ваше решение подчеркивает, что независимо от порядка регулярное выражение займет ... самую длинную группу? - person gui3; 17.11.2018
comment
Вовсе нет, это три разные группы захвата. Первый находит только группы букв, второй - двоеточие, за которым следует группа букв, а последний - просто пробелы. - person AnonymousSB; 17.11.2018
comment
после многих попыток мне кажется, что регулярное выражение соответствует группе по порядку: / (некоторое регулярное выражение) | (. +?) / g делает все, что не является некоторым регулярным выражением, второй группой, но если я инвертирую группы, все находится в ленивая группа, даже некоторые точки совпадения регулярных выражений .... - person gui3; 17.11.2018

Я бы использовал 2 регулярных выражения, первое соответствует словам, которые вы НЕ хотите, а затем replace с empty string, это простое регулярное выражение:

/:\w+/g

Затем replace с empty string. Теперь у вас есть строка, которую можно проанализировать с помощью этого регулярного выражения:

/([ ]+)|([a-z]*)/g

который является упрощенной версией вашего второго регулярного выражения, поскольку запрещенные слова уже исчезли.

person Poul Bak    schedule 17.11.2018
comment
Благодарность ! Я работаю над чем-то в этом роде, сначала анализирую текст, чтобы классифицировать слова, а затем снова анализировать слова, чтобы сохранить те, которые я хочу ... спасибо за \ w! он везде работает? - person gui3; 17.11.2018
comment
Да, насколько мне известно, \ w Работает везде, это очень просто - person Poul Bak; 17.11.2018
comment
Да, \ w полностью поддерживается в JavaScript, как \ d для цифр и \ s для пробелов. - person AnonymousSB; 17.11.2018