Как я могу установить регулярное выражение для специального условия в JavaScript? - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужна помощь для написания шаблона регулярных выражений для следующих условий:

Ограничения на символы хэштега

Длина

  • Вам нужно только добавить # перед словом, чтобы сделать его хэштегом.Однако, поскольку твит может содержать не более 140 символов, лучшими хэштегами являются те, которые состоят из одного слова или нескольких букв.Эксперты Twitter рекомендуют хранить ключевое слово в количестве не более 6 символов.

  • Используйте только цифры и буквы в своем ключевом слове.Вы можете использовать подчеркивание, но делать это экономно по эстетическим соображениям.Дефисы и тире не будут работать.

  • Без пробелов

    Хештеги не поддерживают пробелы.Так что, если вы используете два слова, пропустите пробел.Например, хэштеги для следующих выборов в США помечены как #USelection, а не выборы в долларах США.

  • Без специальных символов

    Хештеги работают только со знаком #.Специальные символы, такие как "!, $,%, ^, &, *, +,."не будет работать.Twitter распознает знак фунта, а затем преобразует хэштег в интерактивную ссылку.

  • Хеш-теги могут начинаться с цифр

  • Хештеги могут быть на любом языке

  • Хештеги могут быть смайликами или символами

Мне пришла в голову такая идея, но она не включает в себя два последних условия:

const subStr = postText.split(/(?=[\s:#,+/][a-zA-Z\d]+)(#+\w{2,})/gm);

const result = _.filter(subStr, word => word.startsWith('#')).map(hashTag => hashTag.substr(1)) || [];

РЕДАКТИРОВАТЬ:

Пример: Если у меня есть:

const postText = "#hello12#123 #hi #£hihi #This is #? #Hyvääpäivää #Dzieńdobry #जलवायुपरिवर्तन an #example of some text with #hash-tags - http://www.example.com/#anchor but dont want the link,#hashtag1,hi #123 hfg skjdf kjsdhf jsdhf kjhsdf kjhsdf khdsf kjhsdf kjhdsf hjjhjhf kjhsdjhd kjhsdfkjhsd #lasthashtag";

Результат должен быть:

["hello12", "123", "hi", "This", "?", "Hyvääpäivää", "Dzieńdobry", "जलवायुपरिवर्तन", "example", "hash", "anchor", "hashtag1", "123", "lasthashtag"]

Что у меня сейчас:

["hello12", "123", "hi", "This", "Hyv", "Dzie", "example", "hash", "anchor", "hashtag1", "123", "lasthashtag"]

Примечание: я не хочу использовать библиотеку JavaScript.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это одно из возможных решений без while, которое сработало для меня, и Спасибо @ Ахмеду Абдельхамиду за шаблон:

function getHashTags(postText) {
  const regex = /#[^\s!$%^&*+.,£#]+/gm;
  const selectedHashTag = [];
  const subStr = postText.split(' ');
  const checkHashTag = _.filter(subStr, word => word.startsWith('#') || word.includes('#'));

  checkHashTag.map((hashTags) => {
    if (hashTags.match(regex)) {
      hashTags.match(regex).map(hashTag => selectedHashTag.push(hashTag.substr(1)));
    }
    return true;
  });
  return selectedHashTag;
}
0 голосов
/ 12 февраля 2019

Предполагая, что символы, которые не разрешены в хэштеге, это !$%^&*+. (те, что вы упомянули) и , (на основе вашего примера), вы можете использовать следующий шаблон регулярных выражений:

/#[^\s!$%^&*+.,#]+/gm

Вот демонстрационная версия .

Примечание. Чтобы исключить больше символов, вы можете добавить их в класс символов, как я делал выше.Очевидно, что вы не можете полагаться на буквенно-цифровые символы только потому, что хотите поддерживать другие символы Юникода и эмодзи.

Пример кода JavaScript:

const regex = /#[^\s!$%^&*+.,#]+/gm;
const str = "#hello12#123 #hi #£hihi #This is #? #Hyvääpäivää #Dzieńdobry #जलवायुपरिवर्तन an #example of some text with #hash-tags - http://www.example.com/#anchor but dont want the link,#hashtag1,hi #123 hfg skjdf kjsdhf jsdhf kjhsdf kjhsdf khdsf kjhsdf kjhdsf hjjhjhf kjhsdjhd kjhsdfkjhsd #lasthashtag";
let m;

while ((m = regex.exec(str)) !== null) {
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    m.forEach((match) => {
        console.log("Found match: " + match);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...