Имеются строки содержащие Наименование, Обозначение, Исполнение и Код документа которые на выходе необходимо разделить символом '|' и устранить опечатки
1. Наименование содержит любые символы до Обозначения или отсутствует (.*)?
т.к. может содержать ненужные пробелы в начале и конце то
(?:\s+)?(.*?)?(?:\s+)?
2. Обозначение имеет вид ([А-Я]{4}\.\d{3})\.\d{3}\.\d{3})
т.к. Обозначение содержит опечатки в разделителе '.' вида '.. ', '. ', ' ' RegExp примет вид
([А-Я]{4})(?:[.\h]{1,2})?(\d{3})(?:[.\h]{1,2})?(\d{3})(?:[.\h]{1,2})?(\d{3})
3. Исполнение начинается с '-' или '_' содержит символы [0-9], может отсутствовать
([_-][0-9]+(?=$|\s|\D))?(?:\s+)?
4 Нулевое исполнение "-00" не записывается
(?:[_-]0+(?=$|\s|\D))?
5 Код 'СБ', 'ГЧ' или отсутствует
(СБ|ГЧ|)
паттерн не отработает замену '_' на '-' и не оптимален :'(
1. Наименование содержит любые символы до Обозначения или отсутствует (.*)?
т.к. может содержать ненужные пробелы в начале и конце то
(?:\s+)?(.*?)?(?:\s+)?
2. Обозначение имеет вид ([А-Я]{4}\.\d{3})\.\d{3}\.\d{3})
т.к. Обозначение содержит опечатки в разделителе '.' вида '.. ', '. ', ' ' RegExp примет вид
([А-Я]{4})(?:[.\h]{1,2})?(\d{3})(?:[.\h]{1,2})?(\d{3})(?:[.\h]{1,2})?(\d{3})
3. Исполнение начинается с '-' или '_' содержит символы [0-9], может отсутствовать
([_-][0-9]+(?=$|\s|\D))?(?:\s+)?
4 Нулевое исполнение "-00" не записывается
(?:[_-]0+(?=$|\s|\D))?
5 Код 'СБ', 'ГЧ' или отсутствует
(СБ|ГЧ|)
Код:
Local $aText[8] = [ _
'Рычаг АБВГ123456 .789 СБ ХВОСТ', _
'Муфта АГВА123.456.789-01 ХВОСТ', _
'Винт АБВГ.123456.789-00XBOCT', _
'ГОСТ 2.201-80 АБВГ.123 456.789_00', _
'АБВГ.123.456. 789_000 СБ', _
'АБВГ.123.456. 789_000СБ', _
'АБВГ.123456.789_0002ХВОСТ', _
'АБВГ.123..456.789_3 ГЧХВОСТ']
$sPatNM='(?:\s+)?(.*?)?(?:\s+)?' ;наименование
$sPatDL = '(?:[.\h]{1,2})?' ;разделитель в Обозначении
$sPatOB = '([А-Я]{4})' & $sPatDL & '(\d{3})' & $sPatDL & '(\d{3})' & $sPatDL & '(\d{3})'; Обозначение
$sPatISP0 = '(?:[_-]0+(?=$|\s|\D))?' ;Исполнение -00
$sPatISP = '([_-][0-9]+(?=$|\s|\D))?(?:\s+)?' ;Исполнение
$sPatKOD='(СБ|ГЧ|)';Код
$sPatXBOCT='(.*$)'
$sPat = $sPatNM&$sPatOB & $sPatISP0&$sPatISP&$sPatKOD&$sPatXBOCT
$sRep = "$1|$2.$3$4.$5|$6|$7|$8"
$sFormat = "%-40s\t->\t%-22s"
For $i = 0 To UBound($aText) - 1
$sText = $aText[$i]
$aResult = StringRegExpReplace($sText, $sPat, $sRep)
ConsoleWrite(StringFormat($sFormat, $sText, $aResult) & @CRLF)
Next