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