打字稿是的验证或使用正则表达式匹配问题的条件
typescript Yup validation or condition with regex using matches problem
我试图确保在字符串中只使用一种类型的特殊字符(分号、逗号或 space)。
有效案例:
- 可以包含字母数字字母和数字
- 可以包含特殊字符 : / .
- 字符串中只能包含一种特殊字符: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;
}
我试图确保在字符串中只使用一种类型的特殊字符(分号、逗号或 space)。
有效案例:
- 可以包含字母数字字母和数字
- 可以包含特殊字符 : / .
- 字符串中只能包含一种特殊字符: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;
}