要求:
- 字符串中不能有大写字母。
- 字符串不能包含任何字符 '^$.?*+()'
- 如果“[”出现在字符串中,则它必须后跟零个或多个字符,但“[”和“]”除外,后者必须后跟“]”。例如,[test] 有效,而 [test not valid, test] 和 [[test]] 无效。 [测试][测试]有效。
- '|' | 后面有的话可以用喜欢|||无效但|测试有效词|无效
function charPos(str, char) {
return str
.split("")
.map(function (c, i) { if (c == char) return i; })
.filter(function (v) { return v >= 0; });
}
function testString(urlPattern)
{
let regex = /[ $^*()+\[\]\\|.\/?]/g;
if(regex.test(urlPattern)){
let secondRegex = true;
let thirdRegex = true;
let regexData = /[ $^*()+\\\\.\/?]/g;
let regexDataNew = /[ $^*()+\\\.\/?]/g;
if(urlPattern.indexOf("[") < urlPattern.indexOf("]") && !regexData.test(urlPattern)){
secondRegex = false;
}
if(urlPattern.indexOf("[") == -1 && urlPattern.indexOf("]") == -1){
secondRegex = false;
}
if(urlPattern.indexOf("[[") != -1 || urlPattern.indexOf("]]") != -1){
secondRegex = true;
}
let pos = charPos(urlPattern,'|');
let largest = pos.sort((a,b)=>a-b)[pos.length - 1];
if(largest+1 < urlPattern.length && !regexDataNew.test(urlPattern)){
thirdRegex = false;
}
if(urlPattern.indexOf("|") == -1 ){
thirdRegex = false;
}
if(secondRegex || thirdRegex){
return 'Not Valid';
}
else {
return 'Valid';
}
}
else {
return 'Valid1';
}
}
// test case
testString('testttthhh@@|sss'); working
testString('testttthhh@@|'); working
testString('testttthhh@@|[]') working but need to show invalid.
如果有人有解决方案或遇到相同类型的问题,请帮助我解决。
谢谢
最佳答案
除了您不想匹配的字符外,您可以使用匹配任何字符。
如果您到达竖线或左方括号,则您断言该竖线后跟一个单词字符,例如 a-z、数字或下划线。
如果遇到左方括号,则将其匹配到右方括号,并断言后面没有另一个方括号。
如果不应匹配空字符串,您可以使用负先行启动模式 ^(?!$)
^[^\s\[\]^$.|?*+()A-Z\\]*(?:(?:\[[^\s\[\]\\]+](?!\])|\|[^\s\[\]^$.|?*+()A-Z\\]+)[^\s\[\]^$.|?*+()A-Z\\]*)*$
解释
^
字符串开始[^\s\[\]^$.|?*+()A-Z\\]*
匹配 0+ 次除列出的任何字符(?:
非捕获组(?:
非捕获组\[[^\s\[\]\\]+](?!\])
从[
...]
匹配code> 后面没有]
|
或者\|[^\s\[\]^$.|?*+()A-Z\\]+
匹配管道并匹配任何列出的单词字符 1+ 次
)
关闭非捕获组[^\s\[\]^$.|?*+()A-Z\\]*
匹配 0+ 次除列出的任何字符
)*
关闭非捕获组并重复 0+ 次,因为不必有|
或[]
present<$
字符串结束
let pattern = /^[^\s\[\]^$.|?*+()A-Z\\]*(?:(?:\[[^\s\[\]\\]+](?!\])|\|[^\s\[\]^$.|?*+()A-Z\\]+)[^\s\[\]^$.|?*+()A-Z\\]*)*$/;
[
"testttthhh@@|sss",
"[]",
"test test",
"test\\test",
"word|@pro",
"word|%pro%",
"testttthhh@@|",
"testttthhh@@|[]",
"[test]",
"[test",
"test]",
"[[test]]",
"[test][test]",
"|||",
"|test",
"word|",
"Atest"
].forEach(s => {
console.log(pattern.test(s) + " --> " + s);
});
关于javascript - 我正在编写一个正则表达式来处理以下内容,但我被困在两者之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62599671/