2017-05-11 70 views
2

我想驗證連接字符串,用戶將粘貼在一個文本框中,我想驗證,如果用戶指定數據庫名稱或不。如何搜索字符串中的特定格式?

Server=myServerAddress;Database=myDataBase;User Id=myUsername; 
Password=myPassword; 

Or 

Server=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername; 
Password=myPassword; 

假設用戶粘貼連接字符串象下面這樣::

尚未指定
Server=myServerAddress;User Id=myUsername;Password=myPassword; 

在這裏,在上述連接字符串數據庫的名字,因此我想

爲SQL Server有效的連接字符串的EG提醒用戶請指定數據庫名稱。

因此,對於低於2種格式SQL服務器是用於指定數據庫正確:

Database=myDataBase 
Or 
Initial Catalog=myDataBase 

所以我想驗證下面這應該是有強制性的連接字符串格式:

Database or Initial Catalog = <DatabaseName> 

但在這裏我的代碼如何指定數據庫或初始目錄關鍵字應該在那裏,並在正則表達式中使用上述格式?

var conn = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"; 
 

 
    function containsWord(string, word) { 
 
     return new RegExp('(?:[^.\w]|^|^\\W+)' + word + '(?:[^.\w]|\\W(?=\\W+|$)|$)').test(string); 
 
    } 
 
    
 
    console.log(containsWord(conn,'Database')); 
 
    
 

Connection string source

+0

只需使用OR運算符:'containsWord(conn,'Database')|| containsWord(conn,'Initial Catalog')' – hindmost

+0

@ behindmost:但是,然後我必須調用我的函數兩次來驗證,我如何驗證正則表達式的格式? –

+0

調用函數兩次會出現什麼問題? – hindmost

回答

2

Regexes真的不是最好的解決方案。最好解析連接字符串(假設分號不能出現在變量中)。

這(ES6)函數返回密鑰值對一個Map

function parseConnectionString(cstr) { 
    return cstr.trim()    // remove whitespace from either end 
      .split(/\s*;\s*/)   // split on semicolons (& removing whitespace) 
      .filter(x => x.length) // removes trailing empty entry 
      .map(kv => kv.split('=')) // create [key, value] pairs 
      .reduce((m, [k, v]) => m.set(k, v), new Map()); 
             // and convert those to a Map 
} 

而這一次然後分別驗證了任兩個鍵(但不是兩者)是存在於所解析的圖:

function isValidConnection(c) { 
    var db = c.get('Database'); 
    var ic = c.get('Initial Catalog'); 

    if (db !== undefined && ic !== undefined) return false; // mutually exclusive 
    return Boolean((db && db.length > 0) || (ic && ic.length > 0)); 
} 
+0

Upvoted爲您的善良努力,幫助我,這是工作正常,但唯一的問題是,如果我不指定數據庫名稱,那麼它也返回true。 –

+0

@學習它適用於我 - 我無法重現。或者你的意思是,如果你做'數據庫=;'沒有價值它失敗? – Alnitak

+0

@學習我已更新'isValidConnection'函數以確保它顯式拒絕空值 – Alnitak

1

請檢查代碼片段

function CheckWordExists(word) { 
 
var ConnectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" 
 

 
var SplitWords = ConnectionString.split(";"); 
 
var IsWordExits = false; 
 
for (var i = 0; i < SplitWords.length; i++) { 
 
    if(SplitWords[i].toString().toLowerCase().indexOf(word.toLowerCase()) >= 0) { 
 
     var databaseName = SplitWords[i].split('=')[1]; 
 
     alert(databaseName); 
 
     //you can check database name here for validation. 
 
     IsWordExists = true; 
 
    } 
 
} 
 

 

 
    return IsWordExists; 
 
} 
 

 
alert(CheckWordExists('Database'))

+0

我不想使用jQuery庫this.I只想使用javascript –

+0

好吧,讓我編輯我的代碼片段 –

+0

有2個關鍵字,我想檢查,這是初始的Catelog和數據庫,所以我需要調用你的函數兩次驗證?使用純JavaScript的 –

2

如果它的確定使用ES6,使用rest parameters可以改變,使得多個單詞可以給出該簽名,無需用一個單一的參數

function containsWord(string, ...words) { 
 
    return new RegExp('(?:[^.\w]|^|^\\W+)' + words.join('|') + '(?:[^.\w]|\\W(?=\\W+|$)|$)').test(string); //left the regex unaltered, only joined the words with or '|' 
 
} 
 

 
var conn = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"; 
 
console.log(containsWord(conn,'Initial Catalog', 'Database')); //true 
 
console.log(containsWord(conn,'Initial Catalog')); //false 
 
console.log(containsWord(conn,'Database')); //true

注改變現有呼叫,我離開了正則表達式作爲是(其他而不是加入單詞,以便正則表達式只被調用一次),假設它的設置有更多的原因,但是您可能希望爲正則表達式使用忽略大小寫參數。當然也有對;很多替代品,如分裂第一,但求使生活方便的主要線索是其餘參數

PS,嚴格來說,你也可以使用你的當前功能以及通過與參數調用它'Intial Catalog|Database'

+0

Upvoted for your kind efforts to help me..Why your second console.log is return false because because if I will just提供初始目錄然後它是正確的 –

+0

第二個返回false爲這個特定的例子,因爲給定的連接字符串不包含「初始目錄」。該呼叫僅用於說明第一個呼叫與第一個呼叫之間的區別,其中兩個選項均以參數形式給出,而另一個呼叫則是單個詞語。實際檢查應該只使用第一個選項。 –

2

const s1 = 'Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;'; 
 
const s2 = 'Server=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;'; 
 

 
const sBad = 'Server=myServerAddress;User Id=myUsername;Password=myPassword;'; 
 

 
const reqWords = ['Server', 'Database', 'User Id', 'Password']; 
 
const reqWords2 = ['Server', 'Initial Catalog', 'User Id', 'Password']; 
 

 
const checkFields = (s, rw) => { 
 
    const words = s.split(';').map(a => a.split('=')[0]).filter(q => q.length); 
 
    return (rw.length === words.length && rw.every(w => words.includes(w))) ? true : false; 
 
} 
 

 
const checkAgainst = (s) => (r1, r2) => checkFields(s, r1) || checkFields(s, r2); 
 

 
const check = (s) => checkAgainst(s)(reqWords, reqWords2) 
 

 
const r1 = check(s1); 
 
const r2 = check(s2); 
 
const r3 = check(sBad); 
 

 
console.log(r1, r2, r3);

如果在瀏覽器中使用,可以考慮換constvar如果有任何兼容性問題。

該代碼將您的字符串拆分爲塊,並檢查是否存在所有必填字段。

checkFields根據預定義值檢查字符串,checkAgainst合併2個備選案例的結果。