Регулярное выражение: анализировать пространства имен в исходном коде c # - PullRequest
2 голосов
/ 10 марта 2019

Я хочу проанализировать пространства имен в файле c # cs, например, using System.Collections.Generic Я хочу захватить группы (System) (Collections) (Generic).

До сих пор я писал этот обычныйвыражение: "[ .]?(\w*?)(?=[.;])"

но оно также помечает каждое слово, которое соответствует этому шаблону.picture with result

Поэтому мне нужно добавить условие, чтобы строка начиналась с "using".

Я пытался добавить это "using[ .]?(\w*?)(?=[.;])", но оно будет захватывать только первое пространство имен.

picture with result

Есть входной текст

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;

string someString;
Console.ReadLine();

Обновление:

Извините, я не упомянул об этом первым, но есть еще одна вещь, то же самое произойдет с методами, например,Console.ReadLine() не должен возвращать ReadLine.То же самое для всех точек, которые не используются

Ответы [ 4 ]

2 голосов
/ 10 марта 2019

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

(?m)(?:^using +|\G(?!^)\.)\K\w+

См. живую демонстрацию здесь

Распределение регулярных выражений:

  • (?m) Включить многострочный режим
  • (?: Начало группы без захвата
    • ^using + Совпадение using в начале строки после пробелов
  • | Или
    • \G(?!^) Начать матч с того места, где закончился предыдущий матч
    • \. Соответствовать периоду
  • ) Конец группы без захвата
  • \K Сбросить вывод
  • \w+ Соответствовать последовательности символов слова
0 голосов
/ 10 марта 2019

Обновлено: Следующее регулярное выражение

(?<=using\s)(\w*(?=[.;]))|\G(\w*(?=[;.]))

даст вам результат, как показано ниже

(?<=using\s) Положительный взгляд позади using и \s пробел

(\w*(?=[.;])) соответствует любому символу слова до . или ;

\G устанавливает позицию в конце предыдущего соответствия.

(\w+(?=[.;])) повторять соответствует любомусимвол слова перед . или ;

Проверьте демонстрацию здесь

0 голосов
/ 10 марта 2019

Вы можете использовать регулярное выражение:

(?<=^using\s)((?:\w+)(?:[.](?:\w+))*)(?=;)

ввод:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

string something;
abc.something;
Console.WriteLine(".test.');

соответствует:

System
System.Collections.Generic
System.Linq
System.Text
System.IO
System.Text.RegularExpressions

затем используйте функцию в каждом совпадении для извлечения каждого промежуточного модуля:

$submodules= explode(".", $match);

демо

https://regex101.com/r/p0K3dN/4/

Пример кода:

$input="

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

string something;
abc.something;
Console.WriteLine('.test.');

";

preg_match_all('/(?<=using\s)(?:\w+)(?:[.](?:\w+))*(?=;)/m', $input, $matches);

foreach($matches as $modules)
    foreach($modules as $module)
            print_r(explode(".",$module)); 

Результат:

Array
(
    [0] => System
)
Array
(
    [0] => System
    [1] => Collections
    [2] => Generic
)
Array
(
    [0] => System
    [1] => Linq
)
Array
(
    [0] => System
    [1] => Text
)
Array
(
    [0] => System
    [1] => IO
)
Array
(
    [0] => System
    [1] => Text
    [2] => RegularExpressions
)
0 голосов
/ 10 марта 2019

Вы можете использовать это (using |[.])(\w+)

Онлайн демо

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