Regex: Возможно ли сделать замену в группе захвата? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть текст в одну строку в формате JSON:

{"schemaText":{"fields":[{"name":"AX_SND_TYPE","type":"string"},{"name":"BWORK","type":"int"}],"name":"XXXSchema","type":"record"},"description":"Autogenerated by NiFi"}

Как видно, есть свойство, называемое "schemaText", которое содержит объект, я хочу преобразовать его в строку, поэтому единственное, что мне нужно сделать, это добавить кавычки в начале и конце свойства и избежать кавычек внутри.

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

({"schemaText":)(\{"fields":\[.*)(,"description.*)

Использование подстановки

$1"$2"$3

дает результат:

{"schemaText":"{"fields":[{"name":"AX_SND_TYPE","type":"string"},{"name":"BWORK","type":"int"}],"name":"XXXSchema","type":"record"}","description":"Autogenerated by NiFi"}

Но все еще остается избежать кавычек, чтобы получить это:

{"schemaText":"{\"fields\":[{\"name\":\"AX_SND_TYPE\",\"type\":\"string\"},{\"name\":\"BWORK\",\"type\":\"int\"}],"name":"XXXSchema","type":"record"}","description":"Autogenerated by NiFi"}

Это допустимый формат JSON.

Вопрос: есть ли способ избежать кавычек внутри группы захвата $ 2 в том же регулярном выражении?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Ответ на ваш вопрос - нет, это невозможно. Вы действительно пытаетесь сделать две разные, не связанные замены в одном регулярном выражении. Эта функция не поддерживается ни одним механизмом регулярных выражений.

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

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

0 голосов
/ 18 сентября 2018

Просто для вашей информации, вы можете соответствовать в каждой позиции, где должно произойти замещение, используя выражение, такое как:

/({"schemaText":)|}(,"description")(.*)|([^"]*)"/g

Единственная проблема, как уже упоминали другие, заключается в том, что вы хотите сделать больше, чем соответствовать; Вы хотите выполнить «условную замену», потому что не существует единственной подстановки, которая охватывала бы все 3 случая, с которыми вы имеете дело (вставьте начало ", вставьте \ перед кавычками и вставьте окончание ").

На самом деле вы можете выполнить это с помощью одного вызова replace ():

var test = "{\"schemaText\":{\"fields\":[{\"name\":\"AX_SND_TYPE\",\"type\":\"string\"},{\"name\":\"BWORK\",\"type\":\"int\"}],\"name\":\"XXXSchema\",\"type\":\"record\"},\"description\":\"Autogenerated by NiFi\"}";
window.alert(test.replace(/({"schemaText":)|}(,"description")(.*)|([^"]*)"/g, function(a,b,c,d,e){ return (b=="{\"schemaText\":"?b+"\"":(c==",\"description\""?"}\""+c+d:e+"\\\"")) })));

Так что это технически "то же самое регулярное выражение", но параметр замещения использует встроенную функцию в качестве замены, а не статическую строку.

0 голосов
/ 15 сентября 2018

Я бы порекомендовал решить эту проблему с помощью кода, например с ванилью JavaScript:

let json = '{"schemaText":{"fields":[{"name":"AX_SND_TYPE","type":"string"},{"name":"BWORK","type":"int"}],"name":"XXXSchema","type":"record"},"description":"Autogenerated by NiFi"}';

let obj = JSON.parse(json);
let schemaTextAsString = JSON.stringify(obj.schemaText)
obj.schemaText = schemaTextAsString

var result = JSON.stringify(obj)

Вы можете увидеть это рабочее здесь .

Обратите внимание, что в желаемом выводе вы не экранировали кавычки в поле имени schemaText, но этот код делает.

Наконец, когда я использую регулярные выражения, я всегда вспоминаю эту классическую статью «Регулярные выражения: теперь у вас две проблемы» !

...