Октава-поиск слов в строке с помощью регулярных выражений
В Октаве я нахожу слова, заканчивающиеся только пробелами, либо запятыми, либо точкой, за которой следуют пробелы.
Вот мой код:
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 ответа:
Попробуйте это
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, который не соответствует, если его подшаблон совпадает справа от текущего местоположения в строке).