如何正确检查 javascript 中的字符串是否匹配正则表达式
How to correctly check if a string match regex in javascript
我想检查字符串是否匹配以下模式
文本包含在两个 "
之间,每个文本之间可以用 ;
分隔,附加 ;
是强制性的
我尝试使用正则表达式 /"(.*?)";?/
但无法正常工作
下面的代码片段 test3
return true
但不应匹配正则表达式
我不知道这是我的正则表达式还是我尝试正则表达式的方式
const regex = /"(.*?)";?/;
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
符合前两种情况:
\"(.*)?\";?\s{1}\"(.*)?\";?
示例:
const regex = /\"(.*)?\";?\s{1}\"(.*)?\";?/;
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
您似乎想要匹配以分号分隔的字符串文字,这意味着您可以使用
const sl = String.raw`"[^"\]*(?:\[^][^"\]*)*"`;
const regex = new RegExp(String.raw`^${sl}(?:\s*;\s*${sl})*;?$`);
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
正则表达式^${sl}(?:\s*;\s*${sl})*;?$
匹配
^
- 字符串开头
${sl}
- 字符串文字模式
(?:\s*;\s*${sl})*
- 零个或多个 ;
序列,包含零个或多个空格,然后是字符串文字模式
;?
- 一个可选的 ;
字符(如果您需要在后面匹配尾随空格,请添加 \s*
)
$
- 字符串结尾。
"[^"\]*(?:\[^][^"\]*)*"
模式匹配
"
- 一个 "
字符
[^"\]*
- "
和 \
以外的零个或多个字符
(?:\[^][^"\]*)*
- \
出现零次或多次,然后是任何字符,然后是 "
和 \
以外的零次或多次字符
"
- 一个 "
字符。
/^"[^"]*"(?:\s*;\s*"[^"]*")+;?$/
---2---
---------3---------
-4
...可以分解为...
/^ ... $/
"[^"]*"
(?:\s*;\s*"[^"]*")+
;?
... 然后转换为 ...
- 在新行开始和行结束之间...
- 匹配双引号后跟可选的字符序列,每个字符不是双引号后跟双引号。
- 组
( ... )
以下匹配但不捕获它 (?: ... )
并强制此模式至少出现一次 (?: ... )+
... 在该组中 ...
- 匹配可选空格 (WS) 分号和另一个可选 WS 的序列,后跟已描述的模式 with/under
(2)
.
- 整场比赛允许以 none 或恰好一个分号结束。
const regex = /^"[^"]*"(?:\s*;\s*"[^"]*")+;?$/;
const test1 = `"hello"; "world";`;
const test1a = `"hello" ; "world" ;"world"; "world"`;
const test2 = `"hello" ; "world"`;
const test2a = `"hello";"world" ; "world";"world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
const test6 = `"hello ; world;";"hello ;world"`;
const test6a = `"hello ;world;" "hello; world"`;
const test6b = `"hello; world"`;
//should be true
console.log("test1", regex.test(test1));
console.log("test1a", regex.test(test1a));
console.log("test2", regex.test(test2));
console.log("test2a", regex.test(test2a));
console.log("test6", regex.test(test6));
//should be false
console.log("test3", regex.test(test3));
console.log("test4", regex.test(test4));
console.log("test5", regex.test(test5));
console.log("test6a", regex.test(test6a));
console.log("test6b", regex.test(test6b));
.as-console-wrapper { min-height: 100%!important; top: 0; }
我想检查字符串是否匹配以下模式
文本包含在两个 "
之间,每个文本之间可以用 ;
分隔,附加 ;
是强制性的
我尝试使用正则表达式 /"(.*?)";?/
但无法正常工作
下面的代码片段 test3
return true
但不应匹配正则表达式
我不知道这是我的正则表达式还是我尝试正则表达式的方式
const regex = /"(.*?)";?/;
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
符合前两种情况:
\"(.*)?\";?\s{1}\"(.*)?\";?
示例:
const regex = /\"(.*)?\";?\s{1}\"(.*)?\";?/;
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
您似乎想要匹配以分号分隔的字符串文字,这意味着您可以使用
const sl = String.raw`"[^"\]*(?:\[^][^"\]*)*"`;
const regex = new RegExp(String.raw`^${sl}(?:\s*;\s*${sl})*;?$`);
const test = `"hello"; "world";`;
const test2 = `"hello"; "world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
//should be true
console.log("test1",regex.test(test));
console.log("test2",regex.test(test2));
//should be false
console.log("test3",regex.test(test3));
console.log("test4",regex.test(test4));
console.log("test5",regex.test(test5));
正则表达式^${sl}(?:\s*;\s*${sl})*;?$
匹配
^
- 字符串开头${sl}
- 字符串文字模式(?:\s*;\s*${sl})*
- 零个或多个;
序列,包含零个或多个空格,然后是字符串文字模式;?
- 一个可选的;
字符(如果您需要在后面匹配尾随空格,请添加\s*
)$
- 字符串结尾。
"[^"\]*(?:\[^][^"\]*)*"
模式匹配
"
- 一个"
字符[^"\]*
-"
和\
以外的零个或多个字符
(?:\[^][^"\]*)*
-\
出现零次或多次,然后是任何字符,然后是"
和\
以外的零次或多次字符
"
- 一个"
字符。
/^"[^"]*"(?:\s*;\s*"[^"]*")+;?$/
---2---
---------3---------
-4
...可以分解为...
/^ ... $/
"[^"]*"
(?:\s*;\s*"[^"]*")+
;?
... 然后转换为 ...
- 在新行开始和行结束之间...
- 匹配双引号后跟可选的字符序列,每个字符不是双引号后跟双引号。
- 组
( ... )
以下匹配但不捕获它(?: ... )
并强制此模式至少出现一次(?: ... )+
... 在该组中 ...- 匹配可选空格 (WS) 分号和另一个可选 WS 的序列,后跟已描述的模式 with/under
(2)
.
- 匹配可选空格 (WS) 分号和另一个可选 WS 的序列,后跟已描述的模式 with/under
- 整场比赛允许以 none 或恰好一个分号结束。
const regex = /^"[^"]*"(?:\s*;\s*"[^"]*")+;?$/;
const test1 = `"hello"; "world";`;
const test1a = `"hello" ; "world" ;"world"; "world"`;
const test2 = `"hello" ; "world"`;
const test2a = `"hello";"world" ; "world";"world"`;
const test3 = `"hello; "world"`;
const test4 = `"hello"; world`;
const test5 = `"hello""world"`;
const test6 = `"hello ; world;";"hello ;world"`;
const test6a = `"hello ;world;" "hello; world"`;
const test6b = `"hello; world"`;
//should be true
console.log("test1", regex.test(test1));
console.log("test1a", regex.test(test1a));
console.log("test2", regex.test(test2));
console.log("test2a", regex.test(test2a));
console.log("test6", regex.test(test6));
//should be false
console.log("test3", regex.test(test3));
console.log("test4", regex.test(test4));
console.log("test5", regex.test(test5));
console.log("test6a", regex.test(test6a));
console.log("test6b", regex.test(test6b));
.as-console-wrapper { min-height: 100%!important; top: 0; }