如何在JavaScript中将两个模式与它们之间的空格匹配?

时间:2014-09-09 19:05:37

标签: javascript regex

我知道如何使用JavaScript匹配一个模式:

var pattern = somePattern

    if (!pattern.test(email)) { //do something }

但是如果我必须匹配两个模式之间的空格,那么如果我有这个:

word1 word2

word1 should match pattern1
word2 should match pattern2
a space should be between them

如何使用JavaScript实现这一目标?

word1word2被拒绝(即使他们按顺序排列pattern1pattern2,因为空间不足)

word1应该是知识产权; word2应为数字

一些例子:

172.30.10.10 10 (acceptable)
172.30.10.1010 (not acceptable)
10 10 (not acceptable)
10 172.30.10.10 (not acceptable)

4 个答案:

答案 0 :(得分:2)

根据文件:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source

RegExp对象有一个source属性,它返回正则表达式的字符串表示。

以下是一个例子。

var validName = /\w+ \w+/
var validEmail = /[^@ ]+@.+\..+/
var combined = new RegExp(validName.source + ' ' + validEmail.source);

console.log(combined.test('John Doe jdoe@example.com'));
// outputs true

console.log(combined.test('John Doe bademail@'));
// outputs false

但是,请注意,如果正则表达式包含$^等边界标记,此解决方案将无效。

答案 1 :(得分:1)

将它合并为一个模式:

var pattern = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+\d{1,}/;
var test= '172.30.10.10 10';
var matched = test.match(pattern);

http://regex101.com/r/kU9cN3/3

更新进一步向Brian发表评论。如果需要将它们编码为单独的模式,则可以执行以下操作。如果您想重复使用模式或进行其他组合,这可能很有用。

var ip = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/,
    number = /\d{1,}/,
    combinedRegExp = new RegExp(ip.source+' '+number.source);
var testString = '172.30.10.10 10';
var result = combinedRegExp.test(testString);
console.log(result);//true

http://jsfiddle.net/7Lrsxov8/

答案 2 :(得分:0)

根据Joe Frambach的回答,您可以对输入执行一些健全性检查:

function combinePatterns(pattern1, pattern2, options) {
    if (pattern1.constructor != RegExp || pattern2.constructor != RegExp) {
        throw '`pattern1` and `pattern2` must be RegExp objects';
    }

    var pattern1_str = pattern1.source;
    var pattern2_str = pattern2.source;
    options = options || {};

    // Ensure combining the patterns makes something sensible
    var p1_endOfLine, p2_startOfLine;
    if (pattern1_str.lastIndexOf('$') == pattern1_str.length - 1) {
        p1_endOfLine = true;
        if (options.stripBadDelimiters || options.swapBadDelimiters) {
            pattern1_str = pattern1_str.substr(0, pattern1_str.length - 1);
        }

        if (options.swapBadDelimiters
            && pattern2_str.lastIndexOf('$') != pattern2_str.length - 1) {
            pattern2_str += '$';
        }
    }

    if (pattern2_str.indexOf('^') == 0) {
        p2_startOfLine = true;
        if (options.stripBadDelimiters || options.swapBadDelimiters) {
            pattern2_str = pattern2_str.substr(1);
        }

        if (options.swapBadDelimiters && pattern1_str.indexOf('^') != 0) {
            pattern1_str = '^' + pattern1_str;
        }
    }

    if (p1_endOfLine && p2_startOfLine && options.swapPatterns) {
        var tmp = pattern1_str;
        pattern1_str = pattern2_str;
        pattern2_str = tmp;
    }

    return new RegExp(pattern1_str + ' ' + pattern2_str);
}

var first = combinePatterns(/abc/, /123/);
var second = combinePatterns(/abc$/, /^123/);
var third = combinePatterns(/abc$/, /^123/, { stripBadDelimiters: true });
var fourth = combinePatterns(/abc$/, /^123/, { swapBadDelimiters: true });
var fifth = combinePatterns(/abc$/, /^123/, { swapPatterns: true });

// first = /abc 123/
// second = /abc$ ^123/
// third = /abc 123/
// fourth = /^abc 123$/
// fourth = /^123 abc$/

这不是最终所有可以帮助确保输入产生所需输出的所有内容,但它应该说明在以这种方式重建正则表达式模式时可以使用的各种可能性

答案 3 :(得分:0)

更紧凑和完整的解决方案:

var ipNum = "\\d{1,3}";
var ip    = "(" + ipNum + "\\.){3}" + ipNum;
var num   = "\\d+";

var ipRE  = new RegExp("^\\s*" + ip + "\\s+" + ipNum + "\\s*$");

console.log(ipRE.test(" 172.30.10.10   10   ")); // true