正则表达式:C#源代码中的解析名称空间

时间:2019-03-10 08:23:50

标签: php regex parsing

我想解析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 个答案:

答案 0 :(得分:2)

要开始从特定点开始匹配重复模式,您会发现\G令牌很有帮助:

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

请参见live demo here

正则表达式细目:

  • (?m)启用多行模式
  • (?:非捕获组的开始
    • ^using +在行尾空格处匹配using
  • |
    • \G(?!^)从上一场比赛结束的地方开始比赛
    • \.匹配句号
  • )非捕获组的结尾
  • \K重置输出
  • \w+匹配单词序列

答案 1 :(得分:0)

您可以使用此(using |[.])(\w+)

Online demo

答案 2 :(得分:0)

更新:以下正则表达式

undefined

将为您提供如下结果

(?<=using\s)(\w*(?=[.;]))|\G(\w*(?=[;.])) 正向(?<=using\s)using空白后面

\s匹配(\w*(?=[.;])).之前的任何单词字符

;在上一场比赛的结尾声明位置。

\G重复匹配(\w+(?=[.;])).之前的任何单词字符

Check demo here

答案 3 :(得分:0)

您可以使用正则表达式:

(?<=^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
)