2016-09-23 99 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

相關問題