Используя поиск и заменить на регулярное выражение в JavaScript - PullRequest
3 голосов
/ 16 марта 2019

У меня есть регулярное выражение, которое я использовал в notepad ++ для поиска и замены, чтобы манипулировать каким-то текстом, и я хочу включить его в свой код JavaScript. Это регулярное выражение:

Поиск (?-s)(.{150,250}\.(\[\d+\])*)\h+ и заменить на \1\r\n\x20\x20\x20

По сути, создавая новые абзацы для каждых 150-250 слов и вставляя в них отступ.

Это то, что я пробовал в JavaScript. Для текстовой области <textarea name="textarea1" id="textarea1"></textarea> в HTML. У меня есть следующий JavaScript:

function rep1() {
    var re1 = new RegExp('(?-s)(.{150,250}\.(\[\d+\])*)\h+');
    var re2 = new RegExp('\1\r\n\x20\x20\x20');
    var s = document.getElementById("textarea1").value;
    s = string.replace(re1, re2);
    document.getElementById("textarea1").value = s;
}

Я также пытался поместить регулярные выражения непосредственно в качестве аргументов для string.replace(), но это тоже не работает. Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 16 марта 2019

Несколько выпусков:

  • JavaScript не поддерживает (?-s). Вам нужно будет добавить модификаторы отдельно. Тем не менее, это настройка по умолчанию в JavaScript, поэтому вы можете просто пропустить ее. Если вы хотели, чтобы . также совпадало с переносами строк, используйте [^] вместо . в регулярных выражениях JavaScript.
  • JavaScript не поддерживает \h - горизонтальное пустое пространство. Вместо этого вы можете использовать [^\S\r\n].
  • При передаче строкового литерала в new RegExp имейте в виду, что обратные слэши являются escape-символами для нотации строкового литерала, поэтому они не попадают в регулярное выражение. Так что либо удвойте их, либо используйте буквенное обозначение регулярного выражения JavaScript

  • В JavaScript replace заменит только первое вхождение, если вы не указали модификатор g для регулярного выражения.

  • Замена (второй аргумент replace) не должна быть регулярным выражением. Это должна быть строка, поэтому не применяйте к ней new RegExp.

  • Обратные ссылки в строке замены должны иметь формат $1. JavaScript не поддерживает \1 там.
  • Вы ссылаетесь string, где вы действительно хотите сослаться s.

Это должно работать:

function rep1() {
    var re1 = /(.{150,250}\.(\[\d+\])*)[^\S\r\n]+/g;
    var re2 = '$1\r\n\x20\x20\x20';
    var s = document.getElementById("textarea1").value;
    s = s.replace(re1, re2);
    document.getElementById("textarea1").value = s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...