Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Почему регулярка берет лишние элементы? (https://javascript.ru/forum/events/85021-pochemu-regulyarka-beret-lishnie-ehlementy.html)

mik888em 08.03.2023 18:16

Почему регулярка берет лишние элементы?
 
Вложений: 1
Есть текст :
#Yandex #Apple Chainlink выпустил новую платформу для разработчиков #Functions, которая предоставляет бесплатный доступ к готовым функциям оракулов, упрощая процесс создания децентрализованных приложений на #Blockchain #Chainlink #девелопмент


Есть регулярка : https://regex101.com/r/OsaFNu/1

Почему регулярка берет еще и #Apple , мне нужно чтоб брало только #Functions

См скрин:
Вложение 4900

Не могу добавить справа вот что : слева от искомого хештега ещё должно стоять: пробел словоБезСимвола# пробел

ksa 08.03.2023 18:49

Если регулярка что-то "берет" - значит она так написана. Это аксиома.

Для получения правильной - нужно показать примеры строк и что из них хочется получить в итоге....

voraa 08.03.2023 18:50

Потому, что стоит флаг g

ksa 08.03.2023 19:03

Цитата:

Сообщение от mik888em
справа от искомого хештега ещё должно стоять: пробел словоБезСимвола# пробел

Наверное еще "или начало строки"?

const str = '#Yandex #Apple Chainlink выпустил новую платформу для разработчиков #Functions, которая предоставляет бесплатный доступ к готовым функциям оракулов, упрощая процесс создания децентрализованных приложений на #Blockchain #Chainlink #девелопмент'
const re = /(?<=(?:^|\s)[a-zа-я]+\s)#[a-z]+/gi
alert(str.match(re))

mik888em 08.03.2023 19:15

Вложений: 1
Цитата:

Сообщение от ksa (Сообщение 551057)
Наверное еще "или начало строки"?

const str = '#Yandex #Apple Chainlink выпустил новую платформу для разработчиков #Functions, которая предоставляет бесплатный доступ к готовым функциям оракулов, упрощая процесс создания децентрализованных приложений на #Blockchain #Chainlink #девелопмент'
const re = /(?<=(?:^|\s)[a-zа-я]+\s)#[a-z]+/gi
alert(str.match(re))

он лишнее так берет:
Вложение 4901
Сейчас так пробую:
/(?!#[a-zA-Z0-9_]+\s+)(#[a-zA-Zа-яА-Я]+[,.!:?\s]*)(?=\s[a-zA-Zа-яА-Я])/g


Но если в тексте символ запятой убираю после #Functions, -> #Functions

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

рони 08.03.2023 19:24

mik888em,
const str = '#Yandex #Apple Chainlink выпустил новую платформу для разработчиков #Functions, которая предоставляет бесплатный доступ к готовым функциям оракулов, упрощая процесс создания децентрализованных приложений на #Blockchain #Chainlink #девелопмент'
const re = /(?<=\s\S+\s)#\S+\b/
alert(str.match(re))

ksa 08.03.2023 19:29

Цитата:

Сообщение от mik888em
он лишнее так берет

А чем #Blockchain не угодил?
Впереди него слово без #...

mik888em 08.03.2023 21:34

Дело в том что нужно более точное соответствие, потому что в вашей регулярке правая часть не прописана (что идёт после знаков препинания), а она должна быть прописана для точного соответствия (мне так нужно). Вот как тут на скрине:

Вот регулярка со скрина:
/(?!#[a-zA-Zа-яА-Я0-9_]+\s+)(#[a-zA-Zа-яА-Я]+)[,.!:?\s]?(\s[a-zA-Zа-яА-Я])/g


Но опять же, как только запятую из текста после #Functions мне стоит убрать и тогда регулярка не видит #Functions

А если запятую ставлю, то регулярка захватывает с искомым еще и лишние символы .

Вот что берет:
#Functions, к
то есть почему-то захватывает
, к

рони 08.03.2023 22:49

mik888em,
чем не устраивает #6 ?

mik888em 09.03.2023 00:22

Цитата:

Сообщение от рони (Сообщение 551062)
mik888em,
чем не устраивает #6 ?

извините, но не понял вашего вопроса


Часовой пояс GMT +3, время: 11:01.