2015-03-19 4 views
0

У меня проблема с написанием регулярного выражения (в Ruby, но я не думаю, что он что-то меняет), который выбирает все правильные хэштеги.Как написать соответствие хэштегов regex

Я использовал (/(^|\s)(#+)(\w+)(\s|$)/), который не работает, и я понятия не имею, почему.

В этом примере:

#start #middle #middle2 #middle3 bad#example #another#bad#example #end 

следует отметить #start, #middle, #middle2, #middle3 и #end.

Почему мой код не работает и как должно выглядеть правильное регулярное выражение?

+0

Я голосую, чтобы закрыть этот вопрос не по теме, потому что это запрос кода. –

+2

Это не так: главный вопрос в том, почему мой код не работает - здесь есть много таких вопросов. –

+0

Если таких вопросов достаточно [это не дубликат] (http://stackoverflow.com/questions/12102746/regex-to-match-hashtags-in-a-entent-using-ruby)? –

ответ

1

делает [^#\w](#[\w]*)|^(#[\w]*) работ?

Получение # не следующего персонажа и захват всего, пока не слово.

В случае, если первый знак равен #.

Живая демонстрация: http://regexr.com/3al01

+0

Спасибо, отлично выглядит, но есть еще одно условие (я изменил его некоторое время назад) - в этом случае ничего не стоит отмечать: #xxx #yyy –

+0

huh .. правильно, я тоже думал об этом, но это зависит от того, что вы хотите, например .., учитывая '# xxx # yyy', все ли действует? или нет? или используется только '# xxx'? – kaho

+0

Должно существовать пространство вокруг хеша, так что #xxx в порядке (BTW - знаете ли вы, что не так с моим кодом?) –

0

Как это работает для вас?

(#[^\s+]+) 

Это говорит, что найти хэш-тег, а затем все до пробелов.

+0

Нет, это соответствует 'bad # example'. – brandonscript

+0

Хорошо, это должно быть. '(^ | \ s +) (# [^ \ s +] +)' – chris85

4

А почему оригинал не работает, давайте посмотрим на каждый бит

  1. (^|\s) Начало строки или пустого пространства
  2. (#+) один или более #
  3. (\w+) один или несколько буквенно-цифровых символов
  4. (\s|$) whit e пробел или конец строки

Основная проблема заключается в конфликте между 1 и 4. Когда 1 совпадает с пробелом, в котором эта пробел уже была сопоставлена ​​в последней группе как часть 4. Так что 1 не существует и совпадение переходит к следующему возможному

4 действительно не требуется, так как 3 не будет соответствовать пробелу.

Так вот результат

(?:^|\s)#(\w+) 

https://regex101.com/r/iU4dZ3/3

+0

Он соответствует плохому # примеру, и это не должно. –

+0

кричит, легко исправить, хотя – Appak

+0

Самое чистое и кратчайшее решение. – brandonscript

Смежные вопросы