У меня есть файл виртуальных инструментов с блоками, которые могут содержать любую комбинацию атрибутов, выглядящих так:
POINT=69
Name="M_Frequency Min" Type=ANALOG
Units="Hz"
Archive="AVERAGE" Priority=9999 Latch=0
HysEnable=0 HysVal=0.00000
Bit="0"
Category="Meter"
IsCustom=1
Interval=0
Accumulated=0
DisplayOrder=1
ENDPOINT
POINT=70
Name="M_Voltage Phase A-N Max" Type=ANALOG
Units="Volts"
Archive="AVERAGE" Priority=9999 Latch=0
HysEnable=0 HysVal=0.000000
CritHiEnable=0 CritHiLimit=0.000000
CritLoEnable=0 CritLoLimit=0.000000
CautHiEnable=0 CautHiLimit=0.000000
CautLoEnable=0 CautLoLimit=0.000000
Desc="Voltage Phase A-N Max"
RW=READ
Register="9000"
RegType="H"
DataType="F"
Accumulated=0
DisplayOrder=1
ENDPOINT
Скажем, я бы хотел сопоставить только второй блок (а не первый), используя что-то вроде POINT=[0-9]*(?s)(.*?)(?!ENDPOINT)(\sMax)(.*?)ENDPOINT
Здесь я думаю, что если я установлю свою точку-звездочку так же, чтобы она соответствовала разрывам строк, но затем скажу, чтобы она соответствовала только ленивым, то она остановится, если будет смотреть вперед и увидит что-то, что дисквалифицирует матч. Очевидно, я чего-то здесь не получаю.
Это, конечно, не работает и вместо этого находит весь текст для соответствия. Я также пытался использовать отрицательный набор символов, но также не играл в кости. То, что я пытаюсь сопоставить, это блок POINT to ENDPOINT, только если в нем есть желаемая строка «Max», и я хотел бы дисквалифицировать блок, заканчивающийся на «ENDPOINT», прежде чем нашел «Max».
РЕДАКТИРОВАТЬ1: Вы можете предположить, что будет больше блоков, как этот до и после показанного фрагмента. Я специально пытаюсь получить блок, в котором есть моя целевая строка (поэтому я могу заменить ее другой или удалить). Другие блоки могут содержать или не содержать целевую строку, но если они есть, я бы хотел сопоставлять каждый блок отдельно, а не как одно совпадение.