Подскажите по регулярному выражению.
От: Sharov Россия  
Дата: 07.07.16 17:11
Оценка:
Здравствуйте.

Имеется такая строка (в начале пробел):
C1C -71.940 C1P -71.940 C2C -71.940 C2P -71.940

Написал такое рег. выражение: ^\s*(?<phcor>\s\w{3}\s{1,4}[-]?\d{1,4}.\d{3}){4}\s*$
результат работы.
Group 'phcor':
Capture: C1C -71.940
Capture: C1P -71.940
Capture: C2C -71.940
Capture: C2P -71.940


Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.

В процессе написания темы написал такое выражение: ^\s*(?:\s(?<x>\w{3})\s{1,4}(?<y>[-]?\d{1,4}.\d{3})){4}\s*$
Оно разбивает на две группы -- x и y, по 4 capture в каждой. Вроде уже лучше, но хотелось бы, чтобы группа была одна.

Заранее благодарю.

ЗЫ:Софт для отладки Rad Software Reg. Exp. Designer
Кодом людям нужно помогать!
Отредактировано 07.07.2016 19:36 Sharov . Предыдущая версия .
Re: [offtopic]
От: syrompe  
Дата: 07.07.16 17:54
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Имеется такая строка (в начале пробел):

S> C1C -71.940 C1P -71.940 C2C -71.940 C2P -71.940

ммм...
Опциончики?
Уж не put/call surface ли вы там строить пытаетесь?
Re[2]: [offtopic]
От: Sharov Россия  
Дата: 07.07.16 18:16
Оценка:
Здравствуйте, syrompe, Вы писали:

S>Здравствуйте, Sharov, Вы писали:


S>>Имеется такая строка (в начале пробел):

S>> C1C -71.940 C1P -71.940 C2C -71.940 C2P -71.940

S>ммм...

S>Опциончики?
S>Уж не put/call surface ли вы там строить пытаетесь?

Нет.
Кодом людям нужно помогать!
Re: Подскажите по регулярному выражению.
От: b0r3d0m  
Дата: 07.07.16 18:39
Оценка:
S>Оно разбивает на две группы -- x и y, по 4 capture в каждой. Вроде уже лучше, но хотелось бы, чтобы группа была одна.
Чем Split на результирующих строках не устроил?
Re[2]: Подскажите по регулярному выражению.
От: Sharov Россия  
Дата: 07.07.16 19:05
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

S>>Оно разбивает на две группы -- x и y, по 4 capture в каждой. Вроде уже лучше, но хотелось бы, чтобы группа была одна.

B>Чем Split на результирующих строках не устроил?

Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы.
Кодом людям нужно помогать!
Re[3]: Подскажите по регулярному выражению.
От: b0r3d0m  
Дата: 07.07.16 19:11
Оценка:
S>Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы.
Назвать их <capture.name1> и <capture.name2>?
Как использовать-то в конечном счёте планируете?
Re[4]: Подскажите по регулярному выражению.
От: Sharov Россия  
Дата: 07.07.16 19:39
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

S>>Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы.

B>Назвать их <capture.name1> и <capture.name2>?
B>Как использовать-то в конечном счёте планируете?

Хотелось бы что-нибудь в виде кортежа , т.е. чтобы они были как-то связаны. Типа capture[0].key и capture[0].value.
Кодом людям нужно помогать!
Re: Подскажите по регулярному выражению.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.07.16 20:38
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.


Штатно никакой типизации в регексах нет. Можешь попробовать прикрутить меппер из CodeJam.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: Подскажите по регулярному выражению.
От: Sharov Россия  
Дата: 07.07.16 20:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Sharov, Вы писали:


S>>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.


AVK>Штатно никакой типизации в регексах нет.


Я в курсе, думал, что можно как-то хитро написать рег. выражение, что он в captures сразу отловит нужные пары.
Кодом людям нужно помогать!
Re[3]: Подскажите по регулярному выражению.
От: b0r3d0m  
Дата: 07.07.16 20:50
Оценка:
S>Я в курсе, думал, что можно как-то хитро написать рег. выражение, что он в captures сразу отловит нужные пары.
Судя по reference'у, нет.
Re: Подскажите по регулярному выражению.
От: Strategy  
Дата: 11.07.16 09:10
Оценка: 5 (1)
S>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.

Более типизировано можно, например, если вместо регулярных выражений использовать парсер.

Сейчас есть библиотеки очень простых комбинаторных парсеров, например, Sprache

    Class Capture
        Public ReadOnly Key As String
        Public ReadOnly Value As Decimal

        Public Sub New(Key As String, Value As Decimal)
            Me.Key = Key
            Me.Value = Value
        End Sub
    End Class

    function Test() as integer
        Dim CultureInfo = Globalization.CultureInfo.InvariantCulture

        Dim DecimalParser =
            From Minus In Parse.String("-").Text.Optional
            From Digits In Parse.Digit.Repeat(1, 4).Text
            From Point In Parse.String(".").Text
            From FractionalDigits In Parse.Digit.Repeat(3).Text
            Select Decimal.Parse(
                If(Minus.IsDefined, Minus.Get, String.Empty) & Digits & Point & FractionalDigits, CultureInfo)

        Dim CaptureParser =
            From WhiteSpace In Parse.WhiteSpace
            From Key In Parse.LetterOrDigit.Repeat(3).Text
            From KeyValueSeparator In Parse.WhiteSpace.Repeat(1, 4)
            From Value In DecimalParser
            Select New Capture(Key, Value)

        Dim StringParser =
            From Capture In CaptureParser.Repeat(4)
            Select Capture

        Dim TestString = " C1C -71.940 C1P -71.940 C2C -71.940 C2P -71.940"

        Dim Captures = StringParser.Parse(TestString)
    end function


Парсер преобразует строку в структуру, в данном случае в перечисление объектов типа Capture со свойствами Key строкового типа и Value типа Decimal.
Re[2]: Подскажите по регулярному выражению.
От: Sharov Россия  
Дата: 11.07.16 09:59
Оценка:
Здравствуйте, Strategy, Вы писали:

S>>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.


S>Более типизировано можно, например, если вместо регулярных выражений использовать парсер.


S>Сейчас есть библиотеки очень простых комбинаторных парсеров, например, Sprache


Слишком громоздко, проще split сделать.
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.