我希望能够有效地将字符串与多个正则表达式匹配,以确定此字符串代表的内容。
^[0-9]{1}$ if string matches it is of type 1
^[a-x]{300}$ if string matches it is of type 2
... ...
每次想要匹配字符串时,迭代包含所有正则表达式的集合对我来说太沉重了。
还有更有效的方法吗?也许我可以将这些正则表达式编译成一个大的?也许像Google建议一样的东西,一字又一字地分析?
在我的项目中,我使用的是PHP / MySQL,但我会感谢任何语言的线索。
编辑: 匹配字符串的操作将非常频繁,字符串值会有所不同。
答案 0 :(得分:0)
如果可能,您可以做的是将正则表达式组合在一起并确定字符串属于哪个组。
例如,如果字符串与\d
不匹配,则表示其中没有数字,您可以跳过所有需要一个数字的正则表达式。所以(例如)而不是匹配+300正则表达式,你可以将其缩小到只有25。
答案 1 :(得分:0)
你可以像这样总结你的正则表达式:
^([0-9])|([a-x]{300})$
稍后,如果你获得更多正则表达式,你可以这样做:
^([0-9])|([a-x]{300})|([x-z]{1,5})|([ab]{2,})$...
然后使用此代码:
$input=...
preg_match_all('#^([0-9])|([a-x]{300})$#', $input, $matches);
foreach ($matches as $val) {
if (isset($val[1])) {
// type 1
} else if (isset($val[2])) {
// type 2
}
// and so on...
}
答案 2 :(得分:0)
由于正则表达式将会发生变化,我认为你不能得到一个通用答案 - 你的正则表达式和你处理它们的方式都需要发展。目前,如果您正在寻求优化脚本的处理,请在使用indedOf
之类的内容进行评估之前测试已知字符串,以减轻正则表达式的负担。
例如,如果您有4个字符串:
每个人都属于你所描述的不同“类型”,所以你可以这样做:
//type 1 only contains 0 or 1
//type 2 must have a "2"
//type 3 contains only letters
var arr = [
"asdfsdfkjslkdujflkj2lkjsdlkf2lkja",
"100010010100111010100101001001011",
"101032021309420940389579873987113",
"asdfkajhslkdjhflkjshdlfkjhalksjdf"
];
for (s in arr)
{
if (arr[s].indexOf('2') > 0)
{
//type 2
}
else if (arr[s].indexOf('0') > 0)
{
if ((/^[01]+$/g).test(arr[s]))
//type 1
else
//ignore
}
else if ((/^[a-z]+$/gi).test(arr[s]))
//type 3
}
在此处查看此行动:http://jsfiddle.net/remus/44MdX/