如何在字符串中搜索特定格式?

时间:2017-05-11 07:42:11

标签: javascript

我正在尝试验证用户将粘贴到文本框中的连接字符串,我希望在该文本框中验证用户是否指定了数据库名称。

例如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'));
    
  

Connection string source

4 个答案:

答案 0 :(得分:2)

如果可以使用ES6,使用rest parameters可以更改签名,以便可以给出多个单词,而无需使用单个参数更改现有调用

&#13;
&#13;
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;
&#13;
&#13;

注意,我将正则表达式保留为原样(除了连接单词之外,所以正则只调用一次正则表达式),假设有更多原因进行设置,但是您可能希望使用ignore case参数正则表达式。当然,有许多替代方案,例如首先拆分;,但是让生活更轻松的主要线索是其余参数

PS,严格来说,您可以使用参数'Intial Catalog|Database'

调用它来使用当前函数

答案 1 :(得分:2)

&#13;
&#13;
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;
&#13;
&#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'))