Использование Regex для разделения хэштегов и поиска элементов - PullRequest
1 голос
/ 31 мая 2019

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

text.match(/#[a-z]+/gi);

и выражение регулярного выражения для перечисления всех слов в поиске

text.match(/\S+\s*/g);

Я хочу разделить хэштеги и слова на два отдельных списка, чтобы я мог обновить второе выражение регулярного выражения, чтобы оно игнорировало хэштеги. Как бы я этого достиг?

Например, если введено:

"Hello this is #my #question for today"

Ожидаемый результат должен составлять 2 массива:

[Hello, this, is, for, today], 
[my, question]

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

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вы можете сделать это как с негативным, так и с позитивным взглядом. Очевидно, что негативные взгляды будут совпадать с работами без ваших «хэш-тегов», а позитивные будут совпадать с теми, с ними.


Negative LookBehind, чтобы соответствовать вашим обычным условиям поиска

/\b(?<!#)[^#\s]+/g
  • \b гарантирует, что вы смотрите в начале слова
  • (?<!) - отрицательный взгляд назад. Предотвращает совпадение #

Regex101 Пример


Позитивный взгляд, чтобы соответствовать вашим "хэшированным" словам

/(?<=#)\w+/g
  • (?<=) является положительным взглядом сзади, разрешает совпадение, если # находится позади \w+

Regex101 Пример


Дополнительная информация относительно Lookarounds

0 голосов
/ 31 мая 2019

Вы можете просто разделить на space символы, а затем проверить, начинается ли слово с # или не использовать это регулярное выражение

`/^#.+/`

Вышеупомянутое регулярное выражение с соответствием #, за которым следует по крайней мереодин символ, если вы хотите сопоставить один # также, как вы можете просто использовать startsWith

/^#.+/.test(inp)   ---> inp.startsWith('#')

let str = `Hello this is #my #question for today`

let {withHash,withOutHash} = str.split(/\s+/).reduce((op,inp)=>{
  let hash = /^#.+/.test(inp)
  let key = hash ? 'withHash' : 'withOutHash'
  op[key] = op[key] || []
  op[key].push(inp)
  return op
},{})


console.log(withHash)
console.log(withOutHash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...