#php #regex
#php #регулярное выражение
Вопрос:
У меня есть выражение регулярных выражений #(w )
для отслеживания хэштега, такого как #wine, в строке, и это также происходит с объектами html, такими как amp;#039;. Мне бы это понадобилось, чтобы избежать этого, ища амперсанд. Как я могу это проверить?
Ответ №1:
Я предлагаю использовать отрицательное утверждение lookbehind, если движок регулярных выражений вашего языка поддерживает их:
(?<!amp;)#(w )
В противном случае это сработало бы (хотя и несколько менее элегантно):
(?:^|[^amp;])#(w )
Комментарии:
1. Второе регулярное выражение будет соответствовать
t#wine
тому, что может быть нежелательно.2.Конечно. Я точно не знаю, что имеет в виду OP. Возможно, например,
foo bar baz (#wine)
должно совпадать. Второе регулярное выражение легко настроить по мере необходимости.3. lang — это php, это работает, спасибо, у меня всегда возникают проблемы с негативным взглядом, спасибо за документ.
Ответ №2:
Вы можете попробовать использовать регулярное выражение, подобное этому (?:^|s)(#w )
, и выбрать первую захваченную группу в качестве совпадения.
Комментарии:
1. Это никуда не годится. Границы слов возникают, когда символ слова следует за символом, не являющимся словом (и наоборот). Поскольку «#» является символом, не являющимся словом, предыдущий символ должен быть символом слова, что почти наверняка не то, что имеет в виду OP. Вот краткий тестовый пример, который вы можете запустить в консоли вашего браузера:
/b#w b/.test('#foo #bar #baz')
(спойлер: он возвращаетсяfalse
).2. @davidchambers спасибо, что указали. исправлено регулярное выражение. Я просто пытался сделать что-то простое без оглядки и ошибся 🙂