2016-09-23 2 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» и последнего вхождения «DATETIME» на каждой строке. в этом выборе могут быть другие дефисы, которые не должны совпадать.

- будет соответствовать любому дефису в документе.

Я думаю, мне нужно как-то совместить эти два шаблона, но мое знание регулярного выражения не существует. CAST(-)DateTime не работает.

Каков правильный способ сделать это?

Если важна платформа: это будет использоваться для поиска-замены в Visual Studio Code. Если это невозможно, я абсолютно открыт для использования другого редактора текста/кода.

+0

Это зависит от того, что инструмент/библиотеки регулярных выражений, который вы используете. –

+0

Привет @ WiktorStribiżew, я хочу использовать это в find-replace в Visual Studio Code. Боюсь, я понятия не имею, какой libray они используют в фоновом режиме – Turnip

+0

Извините, но это невозможно, поскольку VSC использует ECMAScript 5 regex. –

ответ

1

Если вы можете использовать Notepad ++, вы можете использовать регулярное выражение на основе оператора \G, который помогает находить последовательные совпадения после начального совпадения.

Использование

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

и заменить любой символ (ы), которые вы хотите (помните, что круглые скобки должны быть экранированы в АЭС шаблонах замены). Ниже я заменил - на §.

Детали:

  • (?:\bCAST\b|(?!^)\G) - целое слово CAST или конечное положение предыдущего матча
  • (?:(?!\b(?:DATETIME|CAST)\b)[^-])* - закаленное жадного знак, который соответствует любому полукокса, но - (см [^-]), что не начать целую цепочку целых слов DATETIME или CAST (см. отрицательный прогноз (?!\b(?:DATETIME|CAST)\b))
  • \K - a матч opeator сброса: весь текст соответствует до сих пор отбрасывают
  • - - дефис мы хотим, чтобы соответствовать

enter image description here

+1

Это сработало. Спасибо. Вы избавили меня от необходимости редактировать 4000 вставных утверждений. – Turnip

Смежные вопросы