如何正确检查 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

...可以分解为...

  1. /^ ... $/
  2. "[^"]*"
  3. (?:\s*;\s*"[^"]*")+
  4. ;?

... 然后转换为 ...

  1. 在新行开始和行结束之间...
  2. 匹配双引号后跟可选的字符序列,每个字符不是双引号后跟双引号。
  3. ( ... ) 以下匹配但不捕获它 (?: ... ) 并强制此模式至少出现一次 (?: ... )+ ... 在该组中 ...
    • 匹配可选空格 (WS) 分号和另一个可选 WS 的序列,后跟已描述的模式 with/under (2).
  4. 整场比赛允许以 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; }