/ / Как мога да свържа граница на дума “или” [@ #]? - рубин, регрекс, дума-граница

Как мога да сравнявам границите на думите "или" [@ #]? - рубин, реге, гранична дума

Не мога да получа регекс, който съответства или на хештега #, 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"]