匹配使用指令

时间:2012-07-18 15:18:41

标签: c# .net regex

我需要格式化几个类。我需要将using指令放在命名空间中。换句话说,我必须改变:

// some comment about system
using System;
using System.Collections.Generics; // needed to create lists

namespace MyNamespace
{
     ... code

成:

namespace MyNamespace
{

     // some comment about system
     using System;
     using System.Collections.Generics; // needed to create lists

     ... code

所以简而言之,我希望能够匹配:

// some comment about system
using System;
using System.Collections.Generics; // needed to create lists

到目前为止我所做的是这个正则表达式:(?s)(//.*?(?=\r))(\r\n|^)*using .*?;

第一组(//.*?(?=\r))(\r\n|^)与评论相匹配。所以如果使用有评论我也想发表评论。请注意,我在组的末尾放置了*,以便有0个或更多注释。由于某种原因第二次使用不符合原因?

3 个答案:

答案 0 :(得分:1)

尝试正则表达式(?s)((//[^\n\r]*)\s*?)*((using [^;]+;)\s*?)+

答案 1 :(得分:0)

你真的需要正则表达式吗?为什么不使用普通字符串函数?您只需要在using之前找到注释和namespace指令,并将它们移到它后面(并可能缩进)。

类似的东西:

  • 逐行阅读文件
  • 如果该行以//开头(可能在空白之后),请记住它(这是评论)
  • 多行评论(/**/)比较棘手。
  • 如果该行以using开头,请记住
  • 如果该行以namespace开头,请将其打印,打印所有记住的行,然后打印其余部分。

答案 2 :(得分:0)

如果你在哪里有类似的东西:

// comment goes here
using System.Text.RegularExpressions; // for regexes
using System.Text; /* comment */
using System.Collections.Generic; // som comment
   /* this is a long comment
       that spans multiple lines
       in order to explain this using */
using System.Foo;




namespace EncloseCodeInRegion
{

正则表达式:

(((//.*?\r\n)|( */\*[\s\S]*?\*/))?(\r\n)? *using .+?;(( *//.*(?=\r))|( */\*[\s\S]*?\*/))?)(?=[\s\S]*?namespace)

将匹配所有using语句。