我正在尝试验证用户将粘贴到文本框中的连接字符串,我希望在该文本框中验证用户是否指定了数据库名称。
例如sql server的有效连接字符串:
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,2种格式对于指定数据库是正确的:
Database=myDataBase
Or
Initial Catalog=myDataBase
所以我想验证下面的格式,它应该是连接字符串中必须的:
Database or Initial Catalog = <DatabaseName>
但是在我的代码中,我如何指定数据库或初始目录关键字应该在那里并且在regex表达式中使用以上格式?
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'));
答案 0 :(得分: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
&#13;
注意,我将正则表达式保留为原样(除了连接单词之外,所以正则只调用一次正则表达式),假设有更多原因进行设置,但是您可能希望使用ignore case参数正则表达式。当然,有许多替代方案,例如首先拆分;
,但是让生活更轻松的主要线索是其余参数
PS,严格来说,您可以使用参数'Intial Catalog|Database'
答案 1 :(得分: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);
&#13;
如果在浏览器中使用,如果存在任何兼容性问题,请考虑将const
交换为var
。
代码将您的字符串拆分为块并检查是否存在所有必填字段。
checkFields
根据预定义的值检查字符串,checkAgainst
结合了2个替代案例的结果。
答案 2 :(得分: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));
}
答案 3 :(得分: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'))