Сложное регулярное выражение (разрывы строк, несколько переменных)

#regex #powershell

#регулярное выражение #powershell

Вопрос:

У меня проблема, когда мне нужно определить этот шаблон:

 "series":[{
"name":"Some variable thing",
"data":[,,,]}
 

Есть разрывы строк, которые меня беспокоят: «Некоторая переменная вещь» будет иметь произвольную длину, а количество запятых в скобках «данные» будет переменным.

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

Редактировать

Вот усеченный образец созданного HTML-файла:

  <!DOCTYPE html>
 <html><body><div class="main-section"></div><script>var options = {
"chart":{
"id":"ChartID-qn5g8ay9",
"height":"350px",
"type":"bar",
"stacked":true},
"title":{
"text":"Fictional Books Sales"},
"legend":{
"show":true,
"position":"top"},
"plotOptions":{
"bar":{
"horizontal":true}},
"dataLabels":{
"enabled":true,
"offsetX":-6,
"style":{
"fontSize":"12px"}},
"series":[{
"name":"Tank Picture",
"data":[,,,,,,]},{
"name":"Bucket Slope",
"data":[53,32,33,52,13,43,32]}],
"xaxis":{
"categories":["2008","2009","2010","2011","2012","2013","2014"]}}
var chart = new ApexCharts(document.querySelector('#ChartID-qn5g8ay9'),
            options
        );
chart.render();
 

Обратите внимание, что в файле будет переменное количество диаграмм, но меня интересует только замена первого экземпляра "data":[,,,,,,]},{ , следующего за каждым экземпляром "series":[{ , на с "data":[0,,,,,,]},{ , где количество элементов массива (запятых) является переменным.

Комментарии:

1. это данные JSON? Если это так, то нет необходимости в регулярных выражениях. docs.microsoft.com/en-us/powershell/module /…

2. Ну … это JavaScript, который записывается в HTML-файл с использованием проекта под названием PSWriteHTML, проект в настоящее время не подавляет нули в выходных данных, поэтому я выполняю поиск / замену в выходном файле, пока разработчики не исправят эту ошибку … если они это сделают. github.com/EvotecIT/PSWriteHTML/discussions /…

3. Так, может быть, это JSON? Но если это так, мне придется как-то его извлечь.

Ответ №1:

Учитывая сочетание форматов данных в вашем вводе (HTML, JavaScript, JSON), что затрудняет извлечение и выборочную модификацию встроенных данных JSON, решение регулярных выражений действительно, вероятно, является самым простым:

Используйте -replace оператор на основе регулярных выражений:

 (Get-Content -Raw file.htm) -replace `
  '(?<="series"s*:s*[{s*"name"s*:s*"[^"] ",s*"data":s*[),',
  '0,'
 
  • Get-Content -Raw считывает входной файл целиком, как единую многострочную строку, что позволяет выполнять сопоставление по строкам.
  • Положительное утверждение lookbehind ( (?<=...) ) используется для сопоставления текста, предшествующего , интересующему; последний затем заменяется на 0,
  • Для надежности s* вставляется в соответствии с различным количеством пробелов, если таковые имеются, в местах, где они не имеют синтаксического значения в строке JSON, для защиты от случайных изменений форматирования.

Чтобы поэкспериментировать с регулярным выражением в интерактивном режиме, см. <a rel=»noreferrer noopener nofollow» href=»https:///regexstorm.net/tester?p=(?<=»series»s*:s*[{s*»name»s*:s*»[^»]+»,s*»data»:s*[),amp;i=

var options = {
«chart»:{
«id»:»ChartID-qn5g8ay9″,
«height»:»350px»,
«type»:»bar»,
«stacked»:true},
«title»:{
«text»:»Fictional Books Sales»},
«legend»:{
«show»:true,
«position»:»top»},
«plotOptions»:{
«bar»:{
«horizontal»:true}},
«dataLabels»:{
«enabled»:true,
«offsetX»:-6,
«style»:{
«fontSize»:»12px»}},
«series»:[{
«name»:»Tank Picture»,
«data»:[,,,,,,]},{
«name»:»Bucket Slope»,
«data»:[53,32,33,52,13,43,32]}],
«xaxis»:{
«categories»:[«2008″,»2009″,»2010″,»2011″,»2012″,»2013″,»2014″]}}
var chart = new ApexCharts(document.querySelector(‘#ChartID-qn5g8ay9’),
options
);
chart.render();amp;r=0,amp;o=i» rel=»nofollow noreferrer»>Это regexstorm.net страница.

Комментарии:

1. легенда. Я пытался разобраться в этом примерно с 10% случаев, когда ответа не было.

2. Итак, если бы я хотел оценить "","","","","","" вместо , , , , , , это простое изменение?

3.Рад слышать, что это помогло, @n8. Обратите внимание, что регулярное выражение совпадает только с первым , внутри [...] , поэтому следует заменить "", на , в конце регулярного выражения. Также смотрите regexstorm.net я добавил ссылку, которая позволяет вам экспериментировать в интерактивном режиме. (Как правило, regex101.com является более многофункциональным, в частности, включает объяснение регулярного выражения, но оно не поддерживает .NET regex engine; Java engine, который вы можете выбрать там, подходит близко, но в данном случае не работал из-за отсутствия поддержки внешнего вида переменной ширины).

4. Одна небольшая проблема: я получаю случай, когда это происходит: "series":[{ "name":"Data Point 1", "data":[3,,2,]},{ "name":"Data Point 2", "data":[0,,,]} , но я хочу, чтобы массив данных для точки данных 1 был найден только в любой заданной серии. Можно ли это сделать? Чтобы было понятно, исходные значения данных для точки данных 2 таковы [,,,] , и я бы хотел, чтобы они оставались такими.

5. @n8, вы можете заменить , в конце регулярного d , выражения на соответствие существующему номеру сразу после [ — если вам нужна дополнительная помощь, я предлагаю задать новый , целенаправленный вопрос.