Заменить кавычки (но не трогать вложенные кавычки) - PullRequest
0 голосов
/ 10 октября 2019

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

Поэтому, чтобы получить открытую цитату, я использую следующее:

const regexStartQuote = /"(?=\S)/gm;
const replaceStartQuote = '«'

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

// const regexEndQuote = /(?<=\S)"/gm; // not supported in Mozilla
const regexEndQuote = /"(?=\s)/gm;
const replaceEndQuote = '»'

И это работает. Я имею в виду: «Некоторый текст» -> «Некоторый текст»

Кстати, я работаю с draftjs, и эти изменения применяются на лету.

И мне нужно расширить существующие регулярные выражения, так что если предложениедолжно быть что-то вроде:

«Некоторый текст« Текст в кавычках », что-то большее»

И, конечно, возможные варианты, такие как:

«Некоторый текст« Текст в кавычках », что-то еще»

«Некоторый текст:« Текст в кавычках », что-то еще»

«Немного текста:« Текст в кавычках », - нечто большее»

ОБНОВЛЕНИЕ

Ход программы следующий: каждый набираемый символ объединяетсясо строкой. Я имею в виду, сначала, когда, например, текстовое поле пусто

строка просто `` (пусто),

, затем тип пользователя 'w' -> строка становится w,

затем 'o' -> строка wo,

, затем 'w' -> строка wow,

then '' (пробел) -> строка wow,

затем " -> строка равна wow «

и т. Д.

Как я понимаю, регулярное выражение должно выглядеть примерно так:

`ЕслиПользователь набрал «и нет» перед ним, но у нас есть «мы не должны меняться».

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Это обрабатывает вложение строк в кавычках, которые происходят на границе строки (сама строка в кавычках не должна начинать и конец при начале и конец строки). Это несколько искусственно, но если вы хотите разрешить несколько внутренних строк в кавычках во внешней строке в кавычках, то это почти становится необходимостью. Это было бы проблемой. Рассмотрим следующую строку:

var s = '"This is an "internal quote" within a sentence." A short sentence.\n' +
        '"Another quoted sentence."\n' +
        '"Yet another quoted sentence."' +
        'etc.';

Что мешает, например, " A short sentence.\n" и "\n" распознаваться как внутренние строки в кавычках? Другими словами, становится невозможно определить, когда кавычка означает конец внешней строки в кавычках или начало новой внутренней строки в кавычках (по крайней мере, пока вы не доберетесь до конца всего ввода).

Регулярное выражение: ^([^"\n]*)"((?:[^"\n]*"[^"\n]*")*[^"\n]*)"([^*\n]*)$

  1. ^ Соответствует началу строки.
  2. ([^"\n]*) Группа захвата 1: 0 или более символов, которые соответствуют чему-либо, кроме "или перевод строки. Это все, что в строке может предшествовать открывающей котировке.
  3. " Соответствует открывающей котировке. Теперь мы будем искать необязательные строки в кавычках с внешними кавычками
  4. (?:[^"\n]*"[^"\n]*") Группа без захвата, которая ищет 0 или более символов без кавычек / без новой строки, за которыми следует кавычка, за которой следует 0 или болеесимволы без кавычек / без новой строки, за которыми следует кавычка. Это будет внутренняя строка в кавычках.
  5. ((?:[^"\n]*"[^"\n]*"))* Указанный выше шаблон может повторяться 0 или более раз.
  6. [^"\n]*" Соответствует 0 или нескольким символам без кавычек / без новой строкицитатойЭто обеспечивает соответствие остальной части строки в кавычках.
  7. ([^*\n]*) Соответствует оставшейся части строки (0 или более символов), которая не должна содержать кавычку.

Regular expression visualization

Приведенное выше регулярное выражение довольно сложно, поскольку оно проверяет сбалансированные кавычки. Если вам не нужна такая жесткая проверка, то более простое регулярное выражение, которое ищет только первые и последние кавычки в строке, будет (а остальная часть кода останется прежним):

/^([^"\n]*)"([^\n]*)"([^"\n])*$/gm;

var s = 'A plain line.\n' +
        'This is "Some text in quotes" and some without.\n' +
        '"This has "quotes within quotes" and some without."\n' +
        '"This has "many" "quoted" "strings" within quotes."'
        ;

var regex = /^([^"\n]*)"((?:[^"\n]*"[^"\n]*")*[^"\n]*)"([^*\n]*)$/gm;
console.log(s.replace(regex, "$1«$2»$3"));

Обновление

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

  1. Если вход соответствует /^[^"\n]*$/ (без кавычек в строке), то замена не требуется.
  2. Если вход соответствует /^[^«\n]*«([^»\n]*»)?[^"\n]*$/, то замена не требуется.
  3. Если входные данные соответствуют /^([^"«\n]*)"$/ (первая увиденная кавычка), то s = s.replace('"', '«');
  4. Если входные данные соответствуют /^([^"«\n]*)«([^\n]*)"$/ (кроме первой увиденной кавычки), тогда s = s.replace('»', '"'); s = s.replace(/"$/, '»');

Фрагменты кода, по-видимому, не позволяют вводить по-настоящему один символ за раз, но этот код имитирует то, как он будет выглядеть:

function test(str)
{
    let s = '';
    for (let i = 0; i < str.length; i++) {
        key = str.charAt(i);

        s += key;
        if (/^[^"\n]*$/.test(s) || /^[^«\n]*«([^»\n]*»)?[^"\n]*$/.test(s))
            ;
        else if (/^([^"«\n]*)"$/.test(s))
            s = s.replace('"', '«');
        else if (/^([^"«\n]*)«([^\n]*)"$/.test(s)) {
            s = s.replace('»', '"');
            s = s.replace(/"$/, '»');
        }
       console.log("\n" + s);
    }

}

test('a"bc"de"fg"h"ij"');
0 голосов
/ 10 октября 2019

Попробуйте это решение

const startRegex = /^"/gm;
const endRegex = /"$/gm;

str.replace(startRegex, "<<")

str.replace(endRegex, ">>")

const startRegex = /^"/gm;
const endRegex = /"$/gm;
const str = `"Some text "Text in quotes" something more"`

let result = str.replace(startRegex, "<<")
result = result.replace(endRegex, ">>")

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