Не мога да получа регекс, който съответства или на хештега #
, an @
или дума-граница. Целта е да разделим низ в обекти, подобни на Twitter, и:
input = "Hello @world, #ruby anotherString"
input.scan(entitiesRegex)
# => ["Hello", "@world", "#ruby", "anotherString"]
За да получите само думите, с изключение на "anotherString"
което е твърде голямо, е просто:
/bw{3,12}b/
Ще се върне ["Hello", "world", "ruby"]
, За съжаление това не включва хештеги и @
с. Изглежда, че трябва да работи просто с:
/[b@#]w{3,12}b/
но това се връща ["@world", "#ruby"]
, Това ме накара да осъзная, че границите на думите не са по дефиниция характер, така че те не попадат в категорията "Един символ" и, така, няма да съвпадат. Още няколко опита:
/b|[@#]w{3,12}b/
се завръща ["", "", "@world", "", "#ruby", "", "", ""]
.
/((b|[@#])w{3,12}b)/
съвпада с правилните неща, но се връща [[""], ["@"], ["#"], [""]]
както се очаква, защото скобите също означават задържане на всичко затворено.
/((b|[@#])w{3,12}b)/
вид работи. Тя се връща [["Hello", ""], ["@world", "@"], ["#ruby", "#"]]
, Така че сега всички правилни елементи са налице, те се намират в първия елемент на всеки от подразделите.
input.scan(/((b|[@#])w{3,12}b)/).collect(&:first)
Възможно ли е да се опрости това, за да съвпадат и да се върнат правилните подстрани само с нормалния израз, който не изисква collect
последваща обработка?
Отговори:
4 за отговор № 1Можете просто да използвате редовния израз /[@#]?bw+b/
, Това е, по избор, съвпада с a @
или #
, последвано от граница на дума (в #ruby
тази граница ще бъде между #
и ruby
, в нормална дума тя също ще съвпадне в началото на думата) и един куп дума символи.
p "Hello @world, #ruby anotherString".scan(/[@#]?bw+b/)
# => ["Hello", "@world", "#ruby", "anotherString"]
Освен това можете да регулирате броя на символите, които съответната дума трябва да има с квантори. Дадохте пример в коментар към изтрит отговор, който съвпада само #ruby
като се използва {3,4}
:
p "Hello @world, #ruby anotherString".scan(/[@#]?bw{3,4}b/)
# => ["#ruby"]