打字稿是的验证或使用正则表达式匹配问题的条件

typescript Yup validation or condition with regex using matches problem

我试图确保在字符串中只使用一种类型的特殊字符(分号、逗号或 space)。

有效案例:

例如,这应该匹配,因为它只使用一种特殊字符(分号): https://hello.com/example1;https://hello.com.com/example2;https://hello.com.com/example3

这应该会失败,因为它混合了两种类型的特殊字符(space 和分号)

https://hello.com/example1; https://hello.com.com/example2 ;https://hello.com.com/example3

这是我的代码:

const myValidation = yup
.string()
.matches(/^([A-Za-z0-9://,\.]|[A-Za-z0-9:// \.]|[A-Za-z0-9://;\.])+$/, 'Please separate each with a comma, space or semicolon')
.required();

当我只有 /^([A-Za-z0-9://,\.]+$/ 时,如果它只有一个逗号作为特殊字符,它可以正常工作以仅匹配字符串: https://hello.com/example1,https://hello.com.com/example2,https://hello.com.com/example3

但是一旦我添加其他或条件 /^([A-Za-z0-9://,\.]|[A-Za-z0-9:// \.]|[A-Za-z0-9://;\.])+$/ 它就开始允许在字符串中同时使用分号和 space 以及逗号特殊字符(无效的情况)

对于有效情况,您可以使用带有反向引用的捕获组 </code> 以确保“特殊字符”是匹配项之间的相同分隔符</p> <pre><code>^[A-Za-z0-9:/.]+(?:([ ,;])[A-Za-z0-9:/.]+(?:[A-Za-z0-9:/.]+)*)?$

模式匹配:

  • ^ 字符串开头
  • [A-Za-z0-9:/.]+ 匹配 1+ 个允许的字符
  • (?: 非捕获组作为一个整体匹配
    • ([ ,;]) 捕获 组 1,匹配分隔符之一
    • [A-Za-z0-9:/.]+ 匹配 1+ 个允许的字符
    • (?:[A-Za-z0-9:/.]+)* 可选择重复对同一定界符的反向引用,并再次重复 1+ 个允许的字符
  • )?关闭非捕获组并使其可选
  • $ 字符串结束

看到一个regex demo

const regex = /^[A-Za-z0-9:/.]+(?:([ ,;])[A-Za-z0-9:/.]+(?:[A-Za-z0-9:/.]+)*)?$/;
[
  "https://hello.com/example1;https://hello.com.com/example2;https://hello.com.com/example3",
  "https://hello.com/example1; https://hello.com.com/example2 ;https://hello.com.com/example3",
  "https://hello.com/example1"
].forEach(s =>
  console.log(`${regex.test(s)} --> ${s}`)
);


如果应该至少有一个定界符,您可以将模式缩短为:

^[A-Za-z0-9:/.]+([ ,;])[A-Za-z0-9:/.]+(?:[A-Za-z0-9:/.]+)*$

如果字符串应以 http://https:// 开头,您可以使用:

^https?:\/\/[A-Za-z0-9:/.]+(?:([ ,;])https?:\/\/[A-Za-z0-9:/.]+(?:[A-Za-z0-9:/.]+)*)?$

再看一个regex demo

只有一个

function isOnlyOne() {
  let s = "zy,,aemnofgbcjkhilpqasdfrstuvrhfwx";
  console.log([...new Set(s.split("").filter(e => e.match(/[;, ]/)))].length==1);
  //return [...new Set(s.split("").filter(e => e.match(/[a-z]/)))].length==26;
}