Имеется такая строка (в начале пробел):
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
Здравствуйте, syrompe, Вы писали:
S>Здравствуйте, Sharov, Вы писали:
S>>Имеется такая строка (в начале пробел): S>> C1C -71.940 C1P -71.940 C2C -71.940 C2P -71.940
S>ммм... S>Опциончики? S>Уж не put/call surface ли вы там строить пытаетесь?
S>Оно разбивает на две группы -- x и y, по 4 capture в каждой. Вроде уже лучше, но хотелось бы, чтобы группа была одна.
Чем Split на результирующих строках не устроил?
Здравствуйте, b0r3d0m, Вы писали:
S>>Оно разбивает на две группы -- x и y, по 4 capture в каждой. Вроде уже лучше, но хотелось бы, чтобы группа была одна. B>Чем Split на результирующих строках не устроил?
Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы.
S>Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы.
Назвать их <capture.name1> и <capture.name2>?
Как использовать-то в конечном счёте планируете?
Здравствуйте, b0r3d0m, Вы писали:
S>>Всем устраивает. Но может как-то можно потипизированнее? Да и в регулярках прокачался бы. B>Назвать их <capture.name1> и <capture.name2>? B>Как использовать-то в конечном счёте планируете?
Хотелось бы что-нибудь в виде кортежа , т.е. чтобы они были как-то связаны. Типа capture[0].key и capture[0].value.
Здравствуйте, 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>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Sharov, Вы писали:
S>>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.
AVK>Штатно никакой типизации в регексах нет.
Я в курсе, думал, что можно как-то хитро написать рег. выражение, что он в captures сразу отловит нужные пары.
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.
Здравствуйте, Strategy, Вы писали:
S>>Вопрос: а можно внутри описанной именной группы phcor матчить как-то более типизировано, т.е. capture.name1 = 'C1C' capture.name2 = '-71.940'.
S>Более типизировано можно, например, если вместо регулярных выражений использовать парсер.
S>Сейчас есть библиотеки очень простых комбинаторных парсеров, например, Sprache