Расщепление по границам слов, включая апострофы - PullRequest
1 голос
/ 19 февраля 2020

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

Например:

Phrase: This is right.
Groups: [This] [ ] [is] [ ] [right] [.]

Phrase: This isn't right.
Groups: [This] [ ] [isn't] [ ] [right] [.]

Phrase: "I said ok."
Groups: ["] [I] [ ] [said] [ ] [ok] [.] ["]

I ' используя регулярное выражение: str.split(/(?=[.,"\s]|\b)/)

Однако это не работает с апострофами. Для фазы: Это не правильно. , это расщепляется как:

[This] [ ] [isn] ['] [t] [ ] [right] [.]

Есть ли способ сохранить не в одной группе

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Вы можете попробовать найти все совпадения регулярных выражений в шаблоне [A-Za-z']+|[^A-Za-z'], который соответствует либо слову (буквы или апостроф), либо отдельному несловесному символу.

var regex = /[A-Za-z']+|[^A-Za-z']/g;
var input = "\"This isn't right.\"";
var m;
var matches = [];

var i = 0;
do {
    m = regex.exec(input);
    if (m) {
        matches[i] = m[0];
        ++i;
    }
} while (m);

console.log(matches);

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

0 голосов
/ 19 февраля 2020

Вместо этого я бы использовал .match: совпадать с символом слова, за которым следуют (символы слова или апострофы) (\w[\w']*), или совпадать с пробелами: + или совпадать с другой пунктуацией ([.,"]):

\w[\w']*| +|[.,"]

https://regex101.com/r/B755JA/1

const inputs = `This is right.
This isn't right.
"I said ok."`.split('\n');
for (const input of inputs) {
  console.log(input.match(/\w[\w']*| +|[.,"]/g));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...