2014-03-24 14 views
0

我充滿問題的標題太長,但這裏要問:如何查找特定的子字符串中的

如何找到特定字符串的所有實例的字符串佔空間和特殊文字可能是在子

我的意思是這兩側。我正在VB.Net中編寫一個SQL代碼格式化幫助程序。這個程序將幫助我跟進真正的寫SQL。一種實例(並請在此處忽略語法失敗,我不是在SQL書面方式不好的代碼好):

if exists(
    select * 
    from dbo.table 
    where field1 = (if exists (select field1 
           from dbo.table1 
           where field2 = '123') 
        select field1 from table2) 

我的計劃還處於早期階段。我已經確定了大部分關鍵字,並編寫了將它們置於正確格式的代碼。所以在上面的錯誤代碼示例中,所有選擇都將是Select。要做到這一點,我創建的陣列形式的關鍵詞列表,並在下面的函數使用這個數組:

Private Function FindAndReplace(ByVal findWhat As String, _ 
     ByVal replaceWith As String, ByVal focusLine As String) As String 
    focusLine = Microsoft.VisualBasic.Strings.Replace(focusLine, findWhat, _ 
     replaceWith, 1, -1, Constants.vbTextCompare) 
    Return focusLine 
End Function 

好消息是,這個作品真的很好用喜歡選擇的話。像If,Go,On和End這樣的詞語更具挑戰性。如果我有發送單詞,它將用單詞SEnd替換它,因爲End是一個關鍵字。在許多這樣的情況下,我可以通過將較小的單詞放在較大的單詞之前來解釋這一點。我添加了「發送」作爲關鍵字,因爲我們的系統在用戶消息中出現了單詞的次數。

我似乎無法解釋像的話,如果,或去。我認爲搜索「去」,「開」,「)去」,「在(」等,但有些時候,走的是將要上線的第一個字......或者只。

我需要的是一個VB.Net的手段,爲一個給定的子字符串的所有實例(如If)搜索一個字符串。我想我會檢查它是否是字符串中的第一個單詞,或者看它是否是包圍空間或特殊字符的任何組合(或不包括其他字母和下劃線等),我會更新那些符合我的要求,並保留其他人的獨立性。做到這一點,我真的可以使用一些幫助。

+4

_「我不擅長在SQL編寫惡意代碼」 _真可惜! –

+0

也許使用split()和join()並迭代單詞數組,並分別對每個單詞執行操作。 – fnostro

+0

「where field2 ='請選擇」OK「''?簡單的搜索和替換在任何情況下都不起作用。一個可靠的算法將不得不做一些基本的語法分析。 –

回答

1

我正在寫一個SQL代碼格式化幫助程序

我建議從現有的SQL解析器開始。

皮特Sestoft的優秀Programming Language Concepts book介紹分析基本面,包括在第3章

開源Irony project包括SQL grammar樣本寫詞法分析器和解析器規範微SQL。

使用你喜歡的搜索引擎找別人。

我需要的是一個VB。搜索字符串的所有給定的子

目前的情況下的淨手段很多實現這一目標的途徑:

  1. 分割字符串成詞,然後搜索這些詞的實例。
  2. 使用狀態機遍歷字符串並檢查空白後的單詞。

對於選項2,你可以處理引用的字符串,並保持每個字的索引,這裏是在F#很短的例子:http://fssnip.net/f6

+0

謝謝你的詳細解答。我要研究你提到的這本書。在寫非SQL代碼時(我已經有一段時間了),我還在我的腳下。原諒我切換一點點,但是最好是進入C#培訓還是堅持使用VB.Net? –

+0

@JaridLawson如果你有興趣解析我建議看看F#。 C#和VB.Net之間的主要區別是語法,功能幾乎相同。這就是說有更多的C#示例和作業。 –

相關問題