正则表达式匹配引号外的字符串,如果引号不完整,则不匹配任何内容

Regex Match String Outside of Quotes, if the quote is incomplete, do not match anything

我想要的结果:

  1. T1 T3 T5 T8 " = 不匹配,因为引用不完整甚至更好,匹配引用前的字符
    1a. T1 T3 T5 T8 "T4 = 匹配 T1 T3 T5,忽略 T4 = 不是必需的,但如果这也能实现就好了
  2. T1 T3 T5 T8 "T9" = 只匹配T1 T3 T5 T8,忽略T9
  3. O2 T3 O5 "T7 T9" O8 = 匹配 O2 T3 O5 O8,忽略引号内的匹配项

这是我目前使用的正则表达式,但如果引用不完整,我无法让它与所有内容都不匹配。

/(^|\b)(t|o)\d+(?=([^"]*"[^"]*")[^"]*$)/gi

您可以进行两步验证:

a = YourString
a.match(/\"[^\"]+\"/) ? a.replace(/([^\"]*)\".*\"([^\"]*)/,"") : ""

a='T1 T3 T5 T8 "'
# ""

a='O2 T3 O5 "T7 T9" O8'
# "O2 T3 O5  O8"

a='T1 T3 T5 T8 "T9"'
# "T1 T3 T5 T8 "

更新
要覆盖不需要的情况,只需添加另一个条件

a.match(/\"[^\"]+\"/) ? a.replace(/([^\"]*)\".*\"([^\"]*)/,"") : a.replace(/([^\"]*)\"[^\"]*/,"")

试试这个例子:

https://regex101.com/r/bA7oP0/1

 /([^\"]*)\".*\"([^\"]*)/gi

你可以先做一个 replace,然后做一个有条件的 split:

// case 1
var str = 'O2 T3 O5 "T7 T9" O8';
var r = str.replace(/\s*"[^"]*"/g, '');
var m;

if (str != r)
   m = r.split(/\s+/);

console.log(m);
//=> ["O2", "T3", "O5", "O8"]

// Case 2
var str = 'O2 T3 O5 "';
var r = str.replace(/\s*"[^"]*"/g, '');
var m;

if (str != r)
   m = r.split(/\s+/);

console.log(m);
//=> undefined

对于您发布的内容,请使用此模式

"[^"\r\n]*"|"[^"\r\n]*$|(\w+)

并检查子模式#1
Demo