Próbuję utworzyć wzór regex, który podzieli ciąg w szereg słów na podstawie wielu różnych wzorców i konwencji. Zasady są następujące:

  1. Musi podzielić ciąg na wszystkie kreski, przestrzenie, podkreślenia i okresy.
  2. Gdy wiele wyżej wymienionych znaków pojawi się razem, musi tylko podzielić raz (tak "- Quick '])
  3. Musi podzielić ciąg na nowe wielkie litery, zachowując ten list z odpowiednim słowem ("ThequickBrown" podział na ["The '," Quick "," Brown "]
  4. Musi grupować wiele wielkich liter z rzędu razem ("lets_go" musi podzielić na ["pozwala", "go"], a nie ['l', "E", "T", "S", "G", " o '])
  5. Musi używać tylko małych liter w dzielonej tablicy.

Jeśli działa prawidłowo, powinny być prawdziwe

"theQuick--brown_fox JumpsOver___the.lazy  DOG".split_words == 
["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]

Do tej pory byłem w stanie dotrzeć prawie, z jedynym problemem, że dzieli się na każdym stolicy, więc "psa" .Split_words jest ["D", "O", "G"], a nie ["Pies" ]

Używam również kombinacji regex i map / filtrów na podzielonej tablicy, aby dostać się do rozwiązania, punktów bonusowych, jeśli możesz mi powiedzieć, jak się pozbyć i używać tylko Regexa.

Oto, co mam do tej pory:

class String
  def split_words 
    split(/[_,\-, ,.]|(?=[A-Z]+)/).
    map(&:downcase).
    reject(&:empty?)
  end 
end

Który przy wywołaniu ciągiem z testu powyżej zwrotu:

["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "d", "o", "g"]

Jak mogę zaktualizować tę metodę, aby spełnić wszystkie powyższe specyfikacje?

2
Josh Hadik 1 czerwiec 2018, 20:33

2 odpowiedzi

Możesz nieznacznie zmienić regex, więc nie dzieli się na każdy kapitał, ale każda sekwencja liter zaczyna się od kapitału. To tylko polega na umieszczeniu [a-z]+ po [A-Z]+

string = "theQuick--brown_fox JumpsOver___the.lazy  DOG"
regex = /[_,\-, ,.]|(?=[A-Z]+[a-z]+)/
string.split(regex).reject(&:empty?)
# => ["the", "Quick", "brown", "fox", "Jumps", "Over", "the", "lazy", "DOG"]
5
max pleaner 1 czerwiec 2018, 20:16
r = /
    [- _.]+      # match one or more combinations of dashes, spaces,
                 # underscores and periods
    |            # or
    (?<=\p{Ll})  # match a lower case letter in a positive lookbehind
    (?=\p{Lu})   # match an upper case letter in a positive lookahead
    /x           # free-spacing regex definition mode

str = "theQuick--brown_dog, JumpsOver___the.--lazy   FOX for $5"

str.split(r).map(&:downcase)
  #=> ["the", "quick", "brown", "dog,", "jumps", "over", "the", "lazy",
       "fox", "for", "$5"]

Jeśli ciąg ma zostać uszkodzony na pomieszczeniach i wszystkich znakach interpunkcyjnych, wymień [- _.]+ za pomocą [ [:punct:]]+. Wyszukaj "[[:punct:]]" w Regexp dla odniesienia.

2
Cary Swoveland 1 czerwiec 2018, 19:31