Октава-поиск слов в строке с помощью регулярных выражений


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

Вот мой код:

str = 'Hello, I am kjd#(@*#@m, aa.aa.aa.aa. It was nice meeting you.';
regexp(str, "[a-zA-Z]+[,.]?s+", 'match')

Это должно вернуть слова Hello, I, am, It, was, nice, meeting, you. Однако он возвращает только was. Мне трудно это понять.

Я также пытался попробовать этот ответ: https://stackoverflow.com/a/29174222/6213337 , но он возвращает ans = {}(1x0).

Есть идеи? Спасибо.

2 2

2 ответа:

Попробуйте это

str = 'Hello, I am kjd#(@*#@m, aa.aa.aa.aa. It was nice meeting you.';
regexp(str, "(?:^|\\s+)([a-zA-Z]+)(?=[,.]?(?:$|\\s))", 'matches')

Matlab использует PCRE regex flavor, таким образом, шаблон regex, который вам нужен, может быть коротким, компактным и довольно полным:

str = 'Hello, I am kjd#(@*#@m, aa.aa.aa.aa. It was nice meeting you.';
regexp(str, "(?<!\\S)\\p{L}++(?!\\p{P}\\S)", 'match')
print match

Смотрите демоверсииregex иIDEON .

Регулярное выражение соответствует:

  • (?<!\S) - проверьте, нет ли перед текущим местоположением в строке символа, не являющегося пробелом, и если нет, продолжайте сопоставление....
  • \p{L}++ - любые 1 + буквы (собственнически, не допуская обратного хода, таким образом, будет выполнена только следующая проверка один раз после того, как последняя буква совпала) , которые не сопровождаются...
  • (?!\p{P}\S) - любая пунктуация, а затем пробел ((?!...) - это отрицательный lookahead, который не соответствует, если его подшаблон совпадает справа от текущего местоположения в строке).