#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 ,
выражения на соответствие существующему номеру сразу после[
— если вам нужна дополнительная помощь, я предлагаю задать новый , целенаправленный вопрос.