regex lookbehind альтернатива для парсера (js) - PullRequest
0 голосов
/ 17 ноября 2018

Доброе утро

(я видел, что у этой темы много ответов, но я не смог найти подходящий)

Я пишу небольшой парсер в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 году, поэтому я предполагаю, что многие конфликты совместимости браузеров ... и я хотел бы, чтобы он имел как минимум небольшую совместимость ...

Iрассматривал:

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

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

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

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

мой вопрос :

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

Я пытался

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

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

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

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

/:\w+/g

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

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

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

0 голосов
/ 17 ноября 2018

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...