Regex: сопоставление всех слов в фразе

Это возможно?

Для предложения, такого как hello how are youЯ хотел бы, чтобы мое регулярное выражение вернулось hellohowareyou, Это только когда-либо возвращается только hello а не другие слова.

Мой Regex:

[A-Za-z]*

Любая помощь с благодарностью. Спасибо! Если это имеет значение, я использую Pharo Smalltalk. Я тоже тестировал в C#.

5 ответов

Решение

Если вам нужно только разделить предложение на пробелы, это можно сделать с помощью string.Split() метод:

var s = "hello how are you";
var words = s.Split();

Если вы хотите использовать регулярные выражения:

var s = "hello how are you";
var regex = "\\w+";
var words = Regex.Matches(s, regex).Cast<Match>().Select(m => m.Value);

Также в Фаро отправить #substrings сообщение:

'Hello how are you' substrings

и получить массив:

#('Hello' 'how' 'are' 'you').

Вы можете найти главу о Regex в Pharo здесь:

https://ci.inria.fr/pharo-contribution/view/Books/job/DeepIntoPharo/lastSuccessfulBuild/artifact/tmp/PBE2.pdf

Если вы просто хотите разбить строку на пробелы, которые вы можете просто запустить:

Character space split: 'My String To split'

Вы получите OrderedCollection со всеми словами.

Стандарт пытается соответствовать, чего нет, потому что есть пробелы

matcher := RxMatcher forString: '[A-Za-z]*'.
matcher matches: 'hello how are you'

false

Если вы запрашиваете все совпадения, он говорит, что их 5, потому что * также соответствует нулю символов

matcher := RxMatcher forString: '[A-Za-z]*'.
matcher matchesIn: 'hello how are you'

"an OrderedCollection('hello' 'how' 'are' 'you' '')"

И для желаемого результата вы можете попробовать

matcher := RxMatcher forString: '[A-Za-z]+'.
matcher matchesIn: 'hello how are you'

"an OrderedCollection('hello' 'how' 'are' 'you')"

и если вы хотите знать, как долго слова вы можете сделать

matcher := RxMatcher forString: '[A-Za-z]+'.
matcher matchesIn: 'hello how are you' collect: [ :each | each size ]

"an OrderedCollection(5 3 3 3)"    

Вам не нужно Regex в этом случае вообще. Просто использовать Split,

string str = "hello how are you";
string[] parts = str.Split(' ');

В случае, если вы действительно очень хотите Regex, \w+ как регулярное выражение захватывает любое слово. Так что в C# регулярное выражение должно выглядеть так string regex = "\\w+" если вам нужно хотя бы слово.

  • \w обозначает любое слово, включая символы как
  • + квантификатор стоит хотя бы один раз
  • * квантификатор обозначает ноль или более раз
Другие вопросы по тегам