Znajdź i zastąp string (regex)

0

Witam,

chce użyć poleceń regex w notepad++ aby podmieć tylko część szukanego stringu.
Niestety ale jeszcze aż tak dobry w te klocki nie jestem.

Potrzebuje wyszukać takiego stringu:

	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.KV01.02.011RF-MA01.Data.Information.Motortyp" BrowseName="1:Motortyp" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Motortyp</DisplayName>
		<Description Locale="en"></Description>

Przy czym fraza "KV01.02.011" będzie się zmieniać dlatego w to miejsce wstawiam "*"

	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.*RF-MA01.Data.Information.Motortyp" BrowseName="1:Motortyp" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Motortyp</DisplayName>
		<Description Locale="en"></Description>

A w polu Description (jeśli jest puste) chce wstawić następujący string "RF1"

Oczekiwany wynik końcowy to:

	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.KV01.02.011RF-MA01.Data.Information.Motortyp" BrowseName="1:Motortyp" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Motortyp</DisplayName>
		<Description Locale="en">RF1</Description>

Jak to wykonać ?

1

W taki sposób znajdziesz pierwszą część:

NodeId="ns=1;s=AGENT\.OBJECTS\.([A-Z0-9\.]+)RF-MA01\.Data\.Information\.Motortyp"

a w taki pusty description:

<Description Locale="en">(\s*)<\/Description>
0
arczinosek napisał(a):

W taki sposób znajdziesz pierwszą część:

NodeId="ns=1;s=AGENT\.OBJECTS\.([A-Z0-9\.]+)RF-MA01\.Data\.Information\.Motortyp"

a w taki pusty description:

<Description Locale="en">(\s*)<\/Description>

Dziękuje bardzo za pomoc.

Natrafiłem na kolejny problem.
Napisałem taki oto pattern:

<DisplayName Locale="en">Failed<\/DisplayName>.*?\n{1}\t{2}<Description Locale="en">(.{1,25})\.\(.*\?\d{1,2}\)<\/Description>(.*?\n){24}\t{2}<Description Locale="en">(.{1,25})\.\(.*\?\d{1,2}\)<\/Description>(.*?\n){30}\t{3}<uax:String>(.*)<\/uax:String>

Nie potrzebuję grupy 2 grupy 4 - nie udało mi się tego zignorować ... ale to nie jest aż takie istotne.

Potrzebuję teraz w Notepad ++ zamienić stringi (regex grupy).
Potrzebuje w miejsce grupy 1 i 3 wstawić wartość grupy 5.

Próbowałem coś takiego, ale to nie działa :(

$1,$5$2$3,$5$4$5

A tutaj mój przykład: https://regex101.com/r/WSVD1Y/1/

0

Twój regex cały czas wywala mi timeout, więc powiedz mi czy ten wybiera dane, których potrzebujesz?

<DisplayName Locale="en">Failed<\/DisplayName>\s+<Description Locale="en">([a-zA-Z0-9\.]+)\.\S+<\/Description>[\s\S]*?<Description Locale="en">([\w]+)[\s\S]*?<uax:String>([\S]+)<\/uax:String>

https://regex101.com/r/WSVD1Y/3

Jeśli nie, wstaw tutaj fragment z zaznaczonymi blokami, które mają zostać wybrane.

0

Nie, nie wybiera tego czego ja potrzebuję.

	<UAObject NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11]" BrowseName="1:Slave[11]">
		<DisplayName Locale="en">Slave[11]</DisplayName>
		<Description Locale="en">Slave[11]</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1]</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.State_Slave</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Info_Slave</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Version</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Bus_Distributor</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Info_Slave_Mobile</Reference>
		</References>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data" BrowseName="1:Data">
		<DisplayName Locale="en">Data</DisplayName>
		<Description Locale="en">Data</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11]</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information" BrowseName="1:Information">
		<DisplayName Locale="en">Information</DisplayName>
		<Description Locale="en">Information</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Data.Information.SlaveState</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Failed" BrowseName="1:Failed" DataType="Boolean" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Failed</DisplayName>
		<Description Locale="en">F14.2.(KV05.02?3)</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Data.Information.Failed.RelMirrorInput</Reference>
			<Reference ReferenceType="HasNotifier">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Data.Information.Failed.Failed</Reference>
		</References>
		<Value>
			<uax:Boolean>false</uax:Boolean>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Failed.MirrorInput" BrowseName="1:MirrorInput" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">MirrorInput</DisplayName>
		<Description Locale="en">MirrorInput</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Failed</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Mirror.Input</Reference>
		</References>
		<Value>
			<uax:String>OPCUA2S7_Server/ns=4;s=CPUI.Mastersystem[1].Slave[11].Failed</uax:String>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Faulty" BrowseName="1:Faulty" DataType="Boolean" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Faulty</DisplayName>
		<Description Locale="en">F14.2.(KV05.02?3)</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
			<Reference ReferenceType="HasComponent">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Data.Information.Faulty.RelMirrorInput</Reference>
			<Reference ReferenceType="HasNotifier">ns=1;s=ObjectTypes.PROJECT.Profibus.Profibus-Slave.Data.Information.Faulty.Faulty</Reference>
		</References>
		<Value>
			<uax:Boolean>false</uax:Boolean>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Faulty.MirrorInput" BrowseName="1:MirrorInput" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">MirrorInput</DisplayName>
		<Description Locale="en">MirrorInput</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Faulty</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Mirror.Input</Reference>
		</References>
		<Value>
			<uax:String>OPCUA2S7_Server/ns=4;s=CPUI.Mastersystem[1].Slave[11].Faulty</uax:String>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.Id" BrowseName="1:Id" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">Id</DisplayName>
		<Description Locale="en">ATV-32 PROFIBUS-Modul</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:String>F14.2-TA02</uax:String>       
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information.State" BrowseName="1:State" DataType="Boolean" ValueRank="1" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">State</DisplayName>
		<Description Locale="en">State</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].Data.Information</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfBoolean>
				<uax:Boolean>false</uax:Boolean>
				<uax:Boolean>false</uax:Boolean>
				<uax:Boolean>false</uax:Boolean>
				<uax:Boolean>false</uax:Boolean>
			</uax:ListOfBoolean>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11].RelMirrorBase" BrowseName="1:RelMirrorBase" DataType="String" AccessLevel="7" UserAccessLevel="7" Historizing="true">
		<DisplayName Locale="en">RelMirrorBase</DisplayName>
		<Description Locale="en">RelMirrorBase</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS.F06.CPUI.Mastersystem[1].Slave[11]</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Mirror.Relative.Base</Reference>
		</References>
		<Value>
			<uax:String>OPCUA2S7_Server/ns=4;s=CPUI.Mastersystem[1].Slave[11]</uax:String>
		</Value>
	</UAVariable>

Nie potrafię w kodzie wyróżnić tych stringów więc napiszę tutaj. Interesują mnie te trzy linijki:

<Description Locale="en">F14.2.(KV05.02?3)</Description> - z tej linijki potrzebuje F14.2

<Description Locale="en">F14.2.(KV05.02?3)</Description> - z tej linijki potrzebuje F14.2

uax:StringF14.2-TA02</uax:String> - z tej linijki potrzebuję F14.2-TA02

Cel to pierwszą oraz drugą wartość zastąpić wartością z trzeciej linijki.

0

Wydaje mi się, że samymi wyrażeniami regularnymi nie da się tego zrobić. Nawet jeśli się da, prościej napisać program:

#!/usr/bin/env php
<?php
if ($argc != 2) {
    echo "Usage: {$argv[0]} filename" . PHP_EOL;
    exit(1);
}

$filename = $argv[1];

if (!is_readable($filename)) {
    echo "File '{$filename}' not exists or is not readable." . PHP_EOL;
    exit(2);
}

echo preg_replace_callback(
    '/<DisplayName Locale="en">Failed<\/DisplayName>\s+<Description Locale="en">([A-Z0-9\.]+)\.\S+<\/Description>[\s\S]*?<Description Locale="en">([A-Z0-9\.]+\d)\.\([\s\S]*?<uax:String>([A-Z0-9\.\-]+)<\/uax:String>/',
    function($matches) {
        static $pStr = '/<uax:String>([A-Z0-9\.\-]+)<\/uax:String>/';
        $m2 = [];
        
        if (preg_match($pStr, $matches[0], $m2)) {
            list($id,) = explode('-', $m2[1]);
            return preg_replace(
                '/([A-Z0-9\.]+)\.\(/',
                $m2[1] . '.(',
                $matches[0]
            );
        }
        
        return $matches[0];
    },
    file_get_contents($filename)
);

Na windowsie najwygodniej byłoby stworzyć sobie plik .bat do wygodnego wywoływania go (no i trzeba usunąć pierwszą linię).

0

Jesteś wielki, dzięki !!

Zrobiłem to tak, podzieliłem wszyszko na grupy:

(<DisplayName Locale="en">Failed<\/DisplayName>\s+<Description Locale="en">)([A-Z0-9\.]+)(\.\S+<\/Description>[\s\S]*?<Description Locale="en">)([A-Z0-9\.]+\d)(\.\([\s\S]*?<uax:String>)([A-Z0-9\.\-]+)(<\/uax:String>)

I w miejsce grupy 2 i 4 wstawiłem grupę nr 6 :)

$1$6$3$6$5$6$7
0

Natknąłem się na kolejną przeszkodę.

Chcę zastąpić:
Grupa1 -> Grupa1
Grupa2 -> 0
Grupa3 -> Grupa3

Czyli grupę 1 i 3 przepisać, a w miejsce grupy 2 wstaić zero.

Piszę coś takie:

$10$3

Ale on wykrywa chyba grupę 10 i cały ten string zastępuje 'pustą wartością' grupą 10 która nie istnieje.
Jak to zrobić poprawnie ?

0

Może ${1}0${3}?

1 użytkowników online, w tym zalogowanych: 0, gości: 1