Регулярное выражение для разбиения закрывающей скобки с последующим пробелом рядом с "\ b" - PullRequest
0 голосов
/ 09 июля 2019

Используя C #, я разбиваю подобные строки на токены:

Sum(Table.Fieldname) As Alias
Table2.Fieldname2 As Alias

Я разбиваю их как:

var c = "Sum(Table.Fieldname) As Alias";

string[] Tokens = Regex.Split(c, @"\b")

\ b, приятно дал мне все токены, нопроблема в том, что мне нужно рассматривать закрывающую скобку, за которой следует пробел, как отдельные токены, в данный момент они находятся в одном и том же элементе:

?System.text.RegularExpressions.Regex.split("Sum(Table.Fieldname) As Alias", "\b")
{Length=11}
(0): ""
(1): "Sum"
(2): "("
(3): "Table"
(4): "."
(5): "Fieldname"
(6): ") "
(7): "As"
(8): " "
(9): "Alias"
(10): ""

В приведенном выше элементе 6 мне нужно стать элементами 6 и 7с скобками отдельно от пробелов.Как я могу изменить регулярное выражение, чтобы сделать это?

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Если вы можете игнорировать пустые совпадения, вместо Regex.Split(), вы можете использовать Regex.Matches() со следующим шаблоном:

\w+?(?=\W|$)|\W

Regex demo .

C # пример:

string s = "Sum(Table.Fieldname) As Alias";
string[] tokens = Regex.Matches(s,@"\w+?(?=\W|$)|\W")
                       .OfType<Match>()
                       .Select(m => m.Value)
                       .ToArray();
foreach (string token in tokens)
    Console.WriteLine($"'{token}'");

Выход:

'Sum'
'('
'Table'
'.'
'Fieldname'
')'
' '
'As'
' '
'Alias'

Если вы хотитечтобы придерживаться Regex.Split(), вы можете сделать то же самое, используя что-то вроде этого:

(?<=\w)(?=\W)|(?<=\W)(?=.)

Смотрите живой пример C #, сравнивающий оба метода здесь: https://rextester.com/MYF52225

1 голос
/ 09 июля 2019

Вы можете сделать это с помощью:

\b|(?<=\s)(?=\W)|(?<=\W)(?=\s)

Вид пользовательской привязки границы :) Длина нуля, совпадение пробелов и несловесных символов.

(?<=\s)(?=\W) соответствует позициимежду пробелом и несловесным символом.
(?<=\W)(?=\s) наоборот.

См. здесь в regexstorm.


Редактировать

Догадываясь , что ваш дополнительный запрос означает, что вы хотите разделить различные несловарные символы за исключением для пробелов, это может сделать это для вас:

\b|(?<=\s)(?=[^\w\s])|(?<=[^\w\s])(?=\s)|(?<=[^\w\s])(?=[^\w\s])

Он использует класс символов [^\w\s] для представления не слов , таким образом, не совпадая с пробелами.И добавление чередования, которое соответствует позиции между двумя из этого класса символов, также разделяется там.

Здесь в regexstorm

0 голосов
/ 09 июля 2019

Вы можете попытаться разбить символы, не состоящие из слов \W, увидеть соответствующее демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...