У меня есть строка утверждения, подобная этой:
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name } | method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
Мне нужны только самые внешние элементы, поэтому я использую char |
для разделения содержимого, я хочу исключить любые |
, существующие в скобках.
Результатом разделения является то, что у него есть 4 элемента, например:
# 1 *
# 2 { table_name | view_name | table_alias }.*
# 3 {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name } | method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
# 4 column_alias = expression
Я пробовал что-то вроде (?m)\s*^\|\s*
или ^(({\|\s*})({\{})?)({.+})$
, но это просто дало мне ОДИН предмет, а не ЧЕТЫРЕ.
Спасибо за помощь @Wiktor Stribiżew и @Rui Jarimba.
У меня есть идея (?<!\{[^\}]*)\|(?![^\{]*\})
, и я получаю вот так:
# 1 *
# 2 { table_name | view_name | table_alias }.*
# 3
{
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
# 4
udt_column_name [ { . | :: } { { property_name | field_name } | method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
# 5 column_alias = expression
Теперь мне нужно внести изменения, чтобы исправить (?<!\{[^\}]*)\|(?![^\{]*\})
и очистить # 4 ....
хорошо, я нахожу шаблон, может быть, он не идеален, но это работа. это так:
Regex.Split(s, @"(?<!\{(?>[^\{\}]+|\{(?<D>)|\}(?<-D>))*(?(D)(?!)))\|(?!(?>[^\{\}]+|\{(?<D>)|\}(?<-D>))*(?(D)(?!))\})")
Наконец, я хотел бы поблагодарить всех, кто снова помог мне.