正则表达式仅在某些字符上分割

时间:2018-08-05 23:06:44

标签: javascript regex

我需要分割以下文本...

'(!false =>stuff <300^ OR <=200 "TEST DATA")'

有两个规则。我需要保留引用的文本。另外,我需要分割的定界符如下...

{'<', '>', '<=', '=>', '=', '!', '(', ')'}

在这种情况下,我的拆分如下...

['(', '!', 'false', '=>', 'stuff', '<', '300^', 'OR', '<=', '200', '"TEST DATA"', ')']

我已经接近了...

input_text.match(/"[^"]*"|=[<>]|[<>]=|[<>]|[!]|[=]|[()]|\w+/g);

它在大多数情况下都有效,除了一件事之外,不保留诸如^之类的字符。所以没有得到...

300^

我要...

300

如何保持每个字符串完整无缺,并且只拆分提到的定界符?

1 个答案:

答案 0 :(得分:1)

听起来像当您匹配\w+时,您还想匹配同一匹配的子字符串中的^,因此创建一个字符集并将^包含在该字符集中,如下所示:以及\w

const input_text = '(!false =>stuff <300$$^300 OR <=200 "TEST DATA")';
console.log(
  input_text.match(/"[^"]*"|=[<>]|[<>]=|[<>]|[!]|[=]|[()]|[\w^$]+/g)
  //                                                      ^^^^^
);

如果除正则表达式的最后替换之外的所有字符都处理所有特殊情况,则另一种选择是代替最终匹配 word (和选定的特殊字符)的字符,您可以匹配< em>除空格字符外的所有字符(如果有匹配项,则初始替换将优先):

const input_text = '(!false =>stuff <300$$^300 OR <=200 "TEST DATA")';
console.log(
  input_text.match(/"[^"]*"|=[<>]|[<>]=|[<>]|[!]|[=]|[()]|[^\s]+/g)
  //                                                      ^^^^^
);