【问题标题】:C# Regex - Match expression that does not start with a specific wordC# Regex - 匹配不以特定单词开头的表达式
【发布时间】:2018-07-26 09:24:36
【问题描述】:

我已经阅读了类似的问题,但我无法解决这个问题。我想为支持 C# 正则表达式的 Find-Replace Visual Studio 工具使用正则表达式。

我想查找(并用任何内容替换)表达式,例如:

System.Collections.Generic.List
System.Web.UI.WebControls.Button

并删除 System.Collections.Generic.System.Web.UI.WebControls 以整理我的代码。

但我希望能够在“系统”之后添加新词。如果我想缩放它的表达式。所以我创建了这个:

(System\.)?(Collections\.)?(Generic\.)?(Web\.)?(UI\.)?(WebControls\.)?

但是,这也可以使用以下语句进行更改:

using System.Data.SqlClient;

有没有办法改变我的正则表达式,使其不包含以“using”关键字开头的匹配项?

我尝试过使用:

(^?!using)(System\.)?(Collections\.)?(Generic\.)?(Web\.)?(UI\.)?(WebControls\.)?

但这不起作用。谢谢!

【问题讨论】:

  • Imports 是 VB.Net,在 C# 中是 using
  • 没关系。 Visual Studio 中支持的正则表达式 find-replace 使用相同的语法,无论搜索的内容如何。 “进口”正是我想找到的词。问题可能是找到“fapojapof”并且会出现同样的问题。
  • 我用“使用”替换了“导入”以清除问题。我通常在两种类型的项目(c# 和 vb)中都使用这个 find-replace 正则表达式。
  • ^(System\.)?(Collections\.)?(Generic\.)?(Web\.)?(UI\.)?(WebControls\.)?/ 是否适合您的情况?
  • @Leyffda 很遗憾不是因为这依赖于以“系统”开头的行,但它可能类似于:var a = new System.Collections.Generic.List();,它没有被选中。

标签: c# regex replace find


【解决方案1】:

使用否定的lookbehind,断言匹配之前没有using 

(?<!^using )

但是由于所有部分都是可选的,它将匹配Collections. in

using System.Collection.Generic.List

这可能是不想要的,许多正则表达式引擎也有一个限制,lookbehinds 不能有可变长度匹配。

【讨论】:

  • 完美运行。非常感谢!
【解决方案2】:

您拥有的语法将允许部分匹配。尝试指定“使用”必须出现 0 次。 ^(使用){0}

如果这不起作用,您可以执行以下操作: 1.查找并用“usingsistem”替换“using system”。 2.查找并替换system.whatever。 3.查找“usingsistem”并替换为“using system”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2021-02-10
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多