Можно ли добавить в regex match парсить свои типы?
[Record]
class MyType
{
[Accessor]
_s : string;
}
public Main() : void
{
regexp match("abc")
{
| @"(?<m : MyType>\w+)" => WriteLine(m.S);
| _ => WriteLine("No match");
}
}
Это позволит парсить практически все что нужно одним махом.
Здравствуйте, _nn_, Вы писали:
Вопрос закрыт.
Надо добавить в MyType
public static Parse(s : string) : MyType
{
MyType(s)
}
А если MyType трогать нельзя, то можно через дополнительный класс сделать:
public class MyTypeParser
{
public static Parse(s : string) : MyType
{
MyType(s)
}
}
regexp match("abc")
{
| @"(?<m : MyTypeParser>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString()); // A.MyType
| _ => WriteLine("No match");
}
P.S.
По ходу еще баг нашелся. Это все не работает с генериками
using Nemerle.Text;
using System.Console;
using Nemerle.Utility;
module A
{
[Record]
public class MyType[T]
{
[Accessor]
_s : string;
public static Parse(s : string) : MyType[T]
{
MyType(s)
}
}
public Main() : void
{
regexp match("abc")
{
| @"(?<m : MyType[string]>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString());
| _ => WriteLine("No match");
}
}
}
Это компилируется, но падает при запуске.
Здравствуйте, _nn_, Вы писали:
__>Это компилируется, но падает при запуске.
Без указания типа — работает:
using System;
using System.Console;
using SCG = System.Collections.Generic;
using Nemerle.Assertions;
using Nemerle.Text;
using Nemerle.Utility;
namespace test222 {
[Record]
class MyType[T] {
[Accessor] data : T;
public static Parse(s : T) : MyType[T] {
MyType(s)
}
public override ToString() : string {
$<#<<< $data >>>#>
}
}
module Program {
Main() : void {
regexp match(ReadLine()) {
| @"(?<m : MyType>\w+)" => WriteLine("Type is - {0}", m.GetType().ToString());
| _ => WriteLine("No match");
}
WriteLine("Press any key to continue...");
_ = ReadKey(true);
}
}
}
Здравствуйте, hardcase, Вы писали:
Я вот пробовал исправить макрос, но что-то не получается.
Попробовал другое выражение, чтобы паттерн подошел:
Вместо
def namesreg = Regex (@"\(\?\<(\w+)\s*(:\s*((\w|\.)+))?");
def namesreg = Regex (@"\(\?\<(\w+)\s*(:\s*((\w|\.)+(\[(\w|\.)+\])?))?");
Но все равно падает.
Как я понял проблема в наименовании группы, но как-то не получается понять где оно формируется.
Здравствуйте, hardcase, Вы писали:
Есть еще проблема с типами не из своей сборки.
using System;
using System.Console;
using System.Net;
using Nemerle.Text;
namespace X
{
module Program
{
Main() : void
{
regexp match("1.2.3.4")
{
| @"(?<address : IPAddress>\w+)" => Console.WriteLine(address);
| _ => Console.WriteLine("no match")
}
}
}
}
Error: unbound name 'IPAddress'
А если свой тип подставить то работает
namespace X
{
module IPAddressParser
{
public Parse(s : string) : IPAddress
{
IPAddress.Parse(s)
}
}
module Program
{
Main() : void
{
regexp match("1.2.3.4")
{
| @"(?<address : IPAddressParser>\w+)" => Console.WriteLine(address);
| _ => Console.WriteLine("no match")
}
}
}
}