如何在JavaScript中用空格匹配两个模式?
我知道如何使用JavaScript匹配一个模式:如何在JavaScript中用空格匹配两个模式?,javascript,regex,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 如何使用JavaSc
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
被拒绝(即使由于缺少空间,它们的排列顺序非常接近pattern1
和pattern2
)
word1
应该是IPword2
应该是一个数字
一些例子:
172.30.10.10 10 (acceptable)
172.30.10.1010 (not acceptable)
10 10 (not acceptable)
10 172.30.10.10 (not acceptable)
根据文件: RegExp对象有一个
source
属性,该属性返回regex的字符串表示形式
这里有一个例子
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
但是,请记住,如果正则表达式包含边界标记,如
$
和^
将其组合为一个模式,则此解决方案将不起作用:
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);
进一步更新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
根据Joe Frambach的答案,您可以对输入执行一些健全性检查:
函数组合模式(模式1、模式2、选项){
if(pattern1.constructor!=RegExp | | pattern2.constructor!=RegExp){
抛出''pattern1'和'pattern2'必须是RegExp对象';
}
var pattern1_str=pattern1.source;
var pattern2_str=pattern2.source;
选项=选项| |{};
//确保组合这些模式会使某些事情变得合理
变量p1_endOfLine,p2_startOfLine;
if(pattern1_str.lastIndexOf(“$”)==pattern1_str.length-1){
p1_endOfLine=真;
if(options.stripbad分隔符| | options.swapBadDelimiters){
pattern1_str=pattern1_str.substr(0,pattern1_str.length-1);
}
如果(选项1.2)有限制器
&&pattern2_str.lastIndexOf(“$”)!=pattern2_str.length-1){
模式2_str+='$';
}
}
if(pattern2_str.indexOf('^')==0){
p2\ u startOfLine=真;
if(options.stripbad分隔符| | options.swapBadDelimiters){
pattern2_str=pattern2_str.substr(1);
}
if(options.swapaddelimiters&&pattern1_str.indexOf('^')!=0){
pattern1_str='^'+pattern1_str;
}
}
if(p1_endOfLine&&p2_startOfLine&&options.swapPatterns){
var tmp=pattern1_str;
模式1_str=模式2_str;
模式2_str=tmp;
}
返回新的RegExp(pattern1\u str+“”+pattern2\u str);
}
var first=组合模式(/abc/,/123/);
var second=组合模式(/abc$/,/^123/);
var third=combinePatterns(/abc$/,/^123/,{stripBadDelimiters:true});
var fourth=组合模式(/abc$/,/^123/,{swapBadDelimiters:true});
var fifth=combinePatterns(/abc$/,/^123/,{swapPatterns:true});
//第一个=/abc 123/
//秒=/abc$^123/
//第三个=/abc 123/
//第四个=/^abc 123$/
//第四个=/^123 abc$/
这并不是确保输入产生所需输出的全部方法的终点,但它应该说明以这种方式重建正则表达式模式时可以使用的各种可能性。更紧凑、更完整的解决方案:
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
你不能有一个包含空格的组合图案吗?举个例子help@kornieff,请参阅更新+1,我正要发布相同的内容。在现有模式的基础上构建新模式绝对是正确的解决方案。在正常情况下,我认为行分隔符(
$
在第一个结尾或^
在第二个开头)不是问题,因为“它们之间有一个空格”是没有意义的,但是因为您正在将模式转换为字符串,如果需要的话,您可能会删除冒犯的角色。此外,如果模式是使用/abc/
,新RegExp(“abc”)
,或作为参数传递给函数,则此解决方案并不重要。如果您认为答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在那些仍然没有答案的老年人身上。@BrianS那么这不是一个合适的解决方案。但你仍然可以有一个组合模式。