Разделить строку на все символы, кроме некоторых с регулярным выражением - PullRequest
1 голос
/ 16 марта 2019

Мне нужно разбить длинную строку с текстами песен на строки, а затем для каждой строки разделить их на слова. Я собираюсь хранить эту информацию в двумерном массиве.

Я видел несколько похожих вопросов, и они были решены с помощью [NSRegularExpression] (https://developer.apple.com/documentation/foundation/nsregularexpression) но я не могу найти какое-либо регулярное выражение, которое равняется «все, кроме чего-то», и это то, на что я хочу разделить, разбивая строку на слова.

Точнее, я хочу разделить на Все, кроме буквенно-цифровых символов или 'или - . В Java это регулярное выражение [^\\w'-]+

Ниже приведена строка, за которой следует мой код Swift, чтобы попытаться выполнить эту задачу (я просто разделил пробел вместо того, чтобы разделить слова словами "[^ \ w '-] +", так как не могу понять, как сделать это.

 1 Is this the real life?
 2 Is this just fantasy?
 3 Caught in a landslide,
 4 No escape from reality.
 5 
 6 Open your eyes,
 7 Look up to the skies and see,
 8 I'm just a poor boy, I need no sympathy,
 9 Because I'm easy come, easy go,
10 Little high, little low,
11 Any way the wind blows doesn't really matter to me, to me.
12 
13 Mama, just killed a man,

(и т.д.).


let lines = s?.components(separatedBy: "\n")
var all_words = [[String]]()
for i in 0..<lines!.count {
    let words = lines![i].components(separatedBy: " ") 
    let new_words = words.filter {$0 != ""} 
    all_words.append(new_words)
 }

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Я предлагаю использовать обратный шаблон, [\w'-]+, чтобы соответствовал нужным вам строкам и использовать matches функцию сопоставления .

Ваш код будет выглядеть так:

for i in 0..<lines!.count {
    let new_words = matches(for: "[\\w'-]+", in: lines![i]) 
    all_words.append(new_words)
 }

Следующая строка кода:

print(matches(for: "[\\w'-]+", in: "11 Any way the wind blows doesn't really matter to me, to me."))

выход ["11", "Any", "way", "the", "wind", "blows", "doesn\'t", "really", "matter", "to", "me", "to", "me"].

0 голосов
/ 16 марта 2019

Одно простое решение - сначала заменить последовательности специальным символом, а затем разделить его на этот символ:

let words = string
    .replacingOccurrences(of: "[^\\w'-]+", with: "|", options: .regularExpression)
    .split(separator: "|")
print(words)

Однако, если вы можете, используйте системную функцию для перечисления слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...