javascript - 我正在编写一个正则表达式来处理以下内容,但我被困在两者之间

标签 javascript regex reactjs

要求:

  • 字符串中不能有大写字母。
  • 字符串不能包含任何字符 '^$.?*+()'
  • 如果“[”出现在字符串中,则它必须后跟零个或多个字符,但“[”和“]”除外,后者必须后跟“]”。例如,[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<
  • $ 字符串结束

Regex demo

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/

相关文章:

c# - 在 PreRender 中读取脚本标签

javascript - 从选定项中添加和删除项目时,如何在 react 选择中捕获添加和删除事件?

javascript - React JS,加载json数据然后操作它

javascript - 等待操作完成,然后再在 puppeteer 中执行

javascript - 检查 DOM 中隐藏的父元素是否可见

javascript - JSONP 跨域调用 html 给出 javascript 错误

java - 匹配所有内容包括unicode标点符号的正则表达式

javascript - 正则表达式匹配所有字符,直到2个空格

javascript - 搜索字符串中包含通配符的正则表达式

reactjs - Cypress 在我的 ts 文件旁边添加了 js 文件