[英]Regex to remove this string in C#?
我正在使用SMO for SQL Server編寫代理作業腳本,並且生成的腳本字符串具有我要從存儲的最終版本中刪除的具有參數和值。 我要查看的腳本部分是計划添加到作業中,其中包括一個@schedule_uid參數以及與之關聯的GUID。 我想從腳本中完全刪除它。
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name='Job Name',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=10,
@freq_relative_interval=1,
@freq_recurrence_factor=0,
@active_start_date=20150119,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'a70709af-bce7-4c65-a4cd-7574acd31ca2'
我要替換的部分如下:
, \r\n\t\t@schedule_uid=N'a70709af-bce7-4c65-a4cd-7574acd31ca2'
這樣最后一個字符串是:
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name='Job Name',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=10,
@freq_relative_interval=1,
@freq_recurrence_factor=0,
@active_start_date=20150119,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959
我已經嘗試過在線閱讀的各種組合,但是似乎無法替代甚至匹配。 我知道guid匹配的正則表達式為:
\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b'
我試圖將其添加到許多東西中,並認為以下正則表達式可以工作,但無法弄清楚我做錯了什么或缺少什么
@", \r\n\t\t@schedule_uid=N'\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b'"
@", \r\n\t\t@schedule_uid=N'[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}'"
@", \r\n\t\t\b@schedule_uid=N'[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}'\b"
我不是在尋找解決方案,而是想知道我缺少什么。 我已經閱讀了一段時間的regular-expressions.info網站,通常能夠找出正確的正則表達式,但這已經讓我難過了幾天。
編輯:
它並不總是最后一項,並且不能保證它只在腳本中出現一次,因為一個作業可以有多個具有不同@schedule_uid的日程表,而我想擺脫它們而不循環。 這就是為什么我選擇Regex進行操作的原因。 它還需要刪除上一個參數行末尾的逗號,以使代碼保持語法正確。
你去了:
@ schedule_uid = N '[\\ W] {8} - [\\ W] {4} - [\\ W] {4} - [\\ W] {4} - [\\ W] {12}'
使用http://regexpal.com/創建並測試
稍微復雜一點,但是可行。
string test = "EXEC...";
var lines = test.Split(new char [] { ',' }).ToList();
lines = lines.Select((line, index) =>
{
var indexof = line.IndexOf("@schedule_uid");
if (indexof > -1)
{
if (index == 0)
{
return line.Substring(0, indexof);
}
else
{
return null;
}
}
return line + ",";
})
.Where(line => line != null)
.ToList();
test = string.Join(string.Empty, lines);
假設使用基本的字符串操作,則盡可能地少。
string exec = ...
int i = exec.IndexOf("@schedule_uid");
while (i > -1)
{
int j = i;
//Find the previous comma
while (exec[i] != ',')
i--;
//Find the end, next line, or next comma
while (j < exec.Length && exec[j] != '\r' && exec[j] != ',')
j++;
exec = exec.Remove(i, j - i);
i = exec.IndexOf("@schedule_uid");
}
我故意忽略無循環要求,而是希望使用簡單的代碼。 經過測試與這個...
string exec = @"
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule, @schedule_uid=N'a70709af-bce7-4c65-a4cd-7574acd31ca2', @job_id=@jobId, @name='Job Name',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=10,
@freq_relative_interval=1,
@freq_recurrence_factor=0,
@schedule_uid=N'a70709af-bce7-4c65-a4cd-7574acd31ca2',
@active_start_date=20150119,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'a70709af-bce7-4c65-a4cd-7574acd31ca2'";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.