2016-09-23 233 views
3

给出下面的示例,我将如何匹配在单词“CAST”和“DATETIME”之间找到的每个连字符? (CAST(N'2013-11-26 10:52:47.957' AS DateTime)正则表达式匹配两个特定单词之间的连字符

该模式每行出现多次。 字符串中的任何其他地方都可能有连字符,而这些连字符不能匹配。

INSERT [dbo].[tbl_Content] ([Template], [CreatedDate], [Url], [PublishedDate]) VALUES (N’gallery-item.aspx', CAST(N'2013-11-26 10:52:47.957' AS DateTime), N'some-url', CAST(N'2013-11-26 00:00:00.000' AS DateTime)) 
INSERT [dbo].[tbl_Content] ([Template], [CreatedDate], [Url], [PublishedDate]) VALUES (N’another-item.aspx', CAST(N'2013-11-26 10:52:47.957' AS DateTime), N'some-other-url', CAST(N'2013-11-26 00:00:00.000' AS DateTime)) 

CAST(.*)DateTime选择“CAST”的第一次出现和“日期时间”的每行上的最后一个匹配之间的所有字符。在这个选择中可能会有其他连字符不应该匹配。

-将匹配文档中的任何连字符。

我想我需要结合这两种模式,但我的正则表达式知识是不存在的。 CAST(-)DateTime不起作用。

这样做的正确方法是什么?

如果平台很重要:这将用于在Visual Studio Code中查找替换。如果这是不可能的,我绝对愿意使用其他文本/代码编辑器。

+0

这取决于你使用的是什么工具/ regex库。 –

+0

Hi @WiktorStribiżew,我想在Visual Studio代码中的查找替换中使用它。恐怕我不知道在后台使用哪种库文件 – Turnip

+0

对不起,但这是不可能的,因为VSC使用ECMAScript 5正则表达式。 –

回答

1

如果您可以使用Notepad ++,则可以使用基于\G运算符的正则表达式,该运算符有助于在初始匹配后查找连续的匹配项。

使用

(?:\bCAST\b|(?!^)\G)(?:(?!\b(?:DATETIME|CAST)\b)[^-])*\K- 

,并与任何符号()你想(请记住,括号必须NPP替换模式进行转义)取代。在下面,我用§替换了-

详细

  • (?:\bCAST\b|(?!^)\G) - 整个单词CAST或者以前的匹配
  • (?:(?!\b(?:DATETIME|CAST)\b)[^-])*的结束位置 - 即任何字符,但-(见[^-])相匹配的回火贪婪的令牌不开始一个完整的单词序列DATETIMECAST(请参见负向预测(?!\b(?:DATETIME|CAST)\b)
  • \K - a比赛复位opeator:到目前为止匹配的所有文本将被丢弃
  • - - 连字符要匹配

enter image description here

+1

这工作的一种享受。谢谢。你救了我不得不编辑4000+插入语句。 – Turnip

相关问题