Уберите слова, начинающиеся с определенной буквы в предложении, используя регулярное выражение - PullRequest
1 голос
/ 03 февраля 2010

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

word =~ /^#{letter}/ 

чтобы проверить, начинается ли слово с буквы, но как мне переходить от слова к слову. Нужно ли преобразовывать строку в массив, а затем перебирать каждое слово или есть более быстрый способ использования регулярных выражений? Я использую рубин, чтобы это выглядело так:

matching_words = Array.new
sentance.split(" ").each do |word|
  matching_words.push(word) if word =~ /^#{letter}/ 
end

Ответы [ 6 ]

1 голос
/ 03 февраля 2010

Сканирование может быть хорошим инструментом для этого:

#!/usr/bin/ruby1.8

s = "I think Paris in the spring is a beautiful place"
p s.scan(/\b[it][[:alpha:]]*/i)
# => ["I", "think", "in", "the", "is"]
  • \b означает «граница слова».
  • [:alpha:] означает прописную или строчную букву (a-z).
1 голос
/ 03 февраля 2010

Аналогично ответу Anon.

/\b(a\w*)/g

, а затем просмотреть все результаты с (обычно) $ n, где n - это n-й удар.Многие библиотеки будут возвращать / g результаты в виде массивов в $ n-ом наборе скобок, поэтому в этом случае $ 1 вернет массив всех совпадающих слов.Возможно, вы захотите перепроверить любую библиотеку, которую используете, чтобы выяснить, как она возвращает совпадения, как это, к сожалению, существует много вариантов глобальных результатов поиска.

Что касается \ w vs [a-zA-Z], иногда вы можете получить более быстрое выполнение, используя встроенные определения подобных вещей, поскольку он может легко иметь оптимизированный путь для предустановленных классов символов.

/ g вend делает его «глобальным» поиском, поэтому он найдет более одного.В некоторых языках / библиотеках он все еще ограничен строкой, поэтому, если вы хотите проверить весь файл, вам иногда потребуется / gm, чтобы сделать его многострочным

Если выхотите удалить результаты, как подсказывает ваш заголовок (но не вопрос), попробуйте:

    /\ba\w*//g

, который выполняет поиск и замену в большинстве языков (/<search>/<replacement>/).Иногда вам нужны буквы "s" на передней панели.Зависит от языка / библиотеки.В случае Ruby используйте:

string.gsub(/(\b)a\w*(\b)/, "\\1\\2")

, чтобы сохранить несловесные символы, и при необходимости поместите любой замещающий текст между \ 1 и \ 2.gsub для global, sub для первого результата.

1 голос
/ 03 февраля 2010

Вы можете использовать \b. Это соответствует границам слова - невидимое место непосредственно перед и после слова. (Вы их не видите, но они там!) Вот регулярное выражение:

/\b(a\w*)\b/

\w соответствует символу слова, такому как буквы, цифры и тому подобное.

Вы можете увидеть, как я тестирую это здесь: http://rubular.com/regexes/13347

0 голосов
/ 03 февраля 2010

Лично я считаю, что регулярные выражения избыточны для этого приложения, просто запуск выбора более чем способен решить эту конкретную проблему.

"this is a test".split(' ').select{ |word| word[0,1] == 't' } 

result => ["this", "test"]

или если вы решили использовать регулярные выражения, тогда используйте grep

"this is a test".split(' ').grep(/^t/)

result => ["this", "test"]

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2010

Чтобы соответствовать всем словам, начинающимся с t, используйте:

\bt\w+

Это будет соответствовать test, но не footest; \b означает «граница слова».

0 голосов
/ 03 февраля 2010
/\ba[a-z]*\b/i

будет соответствовать любому слову, начинающемуся с 'a'.

\b обозначает границу слова - мы хотим, чтобы совпадение начиналось только с начала слова.

Тогда есть символ, с которого мы хотим начать наше слово.

Тогда у нас есть как можно больше буквенных символов, за которыми следует граница другого слова.

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