Захватывать только букву, за которой следует буква, исключая некоторые слова - Regex - PullRequest
1 голос
/ 25 января 2020

Мне нужно записать букву в строку, за которой следует буква, исключая некоторые конкретные c слова. У меня есть следующая строка в латексе:

22+2p+p^{pp^{2p+pp}}+\delta+\pi+sqrt(2p)+\\frac{2}+{2p}+ppp+2P+\sqrt+xx+\to+p2+\pi+px+ab+\alpha

Я хочу добавить * между буквами, но я не хочу применять следующие слова:

\frac
\delta
\pi
\sqrt
\alpha

вывод должен быть следующим:

22+2p+p^{p*p^{2p+p*p}}+\delta+\pi+\sqrt(2p)+\\frac{2}+{2p}+p*p*p+2P+\sqrt(9)+x*x+\to+p2+\pi+p*x+a*b+\alpha

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

Ответы [ 3 ]

3 голосов
/ 25 января 2020

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

(delta|frac|pi|sqrt|alpha|to)|([a-z](?=[a-z]))

, которое соответствует одному из исключенных слов в группе 1 или букве, за которой следует другая буква в группа 2. В обратном вызове, если присутствует группа 1, возвращается, в противном случае возвращается группа 2, за которой следует *:

let str = '22+2p+p^{pp^{2p+pp}}+\\delta+\\pi+\\sqrt(2p)+\\\\frac{2}+{2p}+ppp+2P+\\sqrt(9)+xx+\\to+p2+\\pi+px+ab+\\alpha';

const replacer = (m, p1, p2) => {
  return p1 ? p1 : (p2 + '*');
}
console.log(str.replace(/(delta|frac|pi|sqrt|alpha|to)|([a-z](?=[a-z]))/gi, replacer));
1 голос
/ 25 января 2020

Вы можете использовать negative lookbehind для решения этой проблемы.

const regex = /(?<!\\{1,})(\b[a-zA-Z]{2,}\b)/g;
const str = `22+2p+p^{pp^{2p+pp}}+\\delta+\\pi+\\sqrt(2p)+\\\\frac{2}+{2p}+ppp+2P+\\sqrt+xx+\\to+p2+\\pi+px+ab+\\alpha`;
let m;
let result = str.replace(regex, function(match) {
   return match.split("").join("*");
});

console.log("Match: ",str.match(regex).toString());
console.log(result);
1 голос
/ 25 января 2020

Вы можете сделать что-то вроде этого:

const str = "22+2p+p^{pp^{2p+pp}}+\\delta+\\pi+\\sqrt(2p)+\\\\frac{2}+{2p}+ppp+2P+\\sqrt+xx+\\to+p2+\\pi+px+ab+\\alpha";

const result = str.replace(/\\?[a-zA-Z]{2,}/g, (v) => {
  if (v.startsWith('\\')) {
    return v;
  }
  return v.split("").join("*");
});

console.log(result);

Для этого нужно сопоставить все 2 или более последовательных букв, которым предшествует \ или нет, и в функции замены, если соответствующая группа не запускается с \ замена устанавливается на разделение на группы букв и объединяется с помощью *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...