Удалить все после постоянного использования регулярных выражений - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть XML с дополнительной информацией, BLAH, в каждом теге.При создании тегов я отделил дополнительную информацию от имени тега константой (XMLSPLIT как константа XML_SPLITTER) ... Мне нужно было сделать это, потому что я генерирую свой XML из объекта JSON, и яне может иметь несколько ключей, которые являются одним и тем же ... но в выводе XML не может быть этого лишнего.

Например:

....
<SetXMLSPLITBLAH>
    <Value>9</Value>
    <SetType>
        <Name>Foo</Name>
    </SetType>
</SetXMLSPLITBLAH>
...

Итак, после генерацииXML, я иду и чищу его.Я пытаюсь сделать это с помощью регулярного выражения.Я полагаю, я хочу удалить что-либо в строке после сплиттера и заменить его просто >.

let reg = new RegExp("<Set"+XML_SPLITTER+"(.*)\/g");
cleanXML = dirtyXML.replace(reg, "<Set>")

Это не работает.

Я отмечу, что яreg = /<Set(.*)/g; и это сработало просто отлично ... но оно также захватывает "SetType" и любое другое использование тега, начинающегося с "

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Использование .* будет соответствовать >, и если - по какой-то причине - ваш XML-файл не разбит на несколько строк (то есть уменьшен), вы будете соответствовать больше, чем должны.Чтобы избежать этого, вы можете использовать [^>]* для сопоставления всего до >.

Поскольку вы корректно включили сплиттер , сопоставление будет намного проще и намногоболее предсказуемо (как вы упомянули, вы соответствуете SetType без разделителя).

Без разделителя вам придется использовать шаблон регулярного выражения, который напоминает <Set(?!Type>)[^>]* или <Set(?!(?:Type|SomethingElse)>)[^>]*, если у вас было большетолько один суффикс к Set, который должен остаться.Эти методы используют отрицательный взгляд, чтобы утверждать, что следующее не совпадает.

var str = `<SetXMLSPLITBLAH>
    <Value>9</Value>
    <SetType>
        <Name>Foo</Name>
    </SetType>
</SetXMLSPLITBLAH>`

var XML_SPLITTER = 'XMLSPLIT'
var p = `(</?)Set${XML_SPLITTER}[^>]*`
var r = new RegExp(p,'g')
x = str.replace(r,'$1Set')

console.log(x)
1 голос
/ 27 сентября 2019

Это потому, что ^ - это специальный символ Regex, обозначающий «начало строки».Вам нужно будет убежать, как \^, чтобы это сработало.Что-то вроде /<Set\^\^[^>]*>/g должно сработать.

Небольшое примечание: приведенное выше регулярное выражение предполагает, что строка "BLAH" в вашем примере никогда не будет содержать символ > ... но если это так, то вашВ любом случае, XML очень плохо сформирован.

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