基于多个分隔符拆分字符串

41

我试图使用多个分隔符来拆分一个字符串,参考了如何在jQuery中使用多个字符串作为分隔符拆分字符串

由于有多个分隔符,所以我决定按照链接中提到的方法进行操作。

var separators = [' ', '+', '-', '(', ')', '*', '/', ':', '?'];
var tokens = x.split(new RegExp(separators.join('|'), 'g'));​​​​​​​​​​​​​​​​​

但是我遇到了错误。

Uncaught SyntaxError: Invalid regular expression: / |+|-|(|)|*|/|:|?/: Nothing to repeat 

如何解决?


2
请看这个链接:https://dev59.com/VHRB5IYBdhLWcg3wWGEH - SamYan
有人能帮我解决这个相关问题吗 https://dev59.com/jHfZa4cB1Zd3GeqPW9xm - Okky
6个回答

64

需要对正则表达式相关的字符进行转义,包括 +、-、(、)、* 和 ?。

var x = "adfds+fsdf-sdf";

var separators = [' ', '\\\+', '-', '\\\(', '\\\)', '\\*', '/', ':', '\\\?'];
console.log(separators.join('|'));
var tokens = x.split(new RegExp(separators.join('|'), 'g'));
console.log(tokens);

http://jsfiddle.net/cpdjZ/


1
这很好用! 但是,new RegExp(separators.join('|'), 'g') 在这里具体做了什么呢? - HussienK
@HussienK 允许在表达式中进行交替,可以查看这里 http://www.regular-expressions.info/alternation.html - melc
2
人。正则表达式。这就是为什么我花了这么长时间才真正学会它们的原因。为什么加号前面有三个斜杠,而星号只有两个斜杠,冒号、斜杠和空格却没有斜杠呢? - LJD

12

这应该能够工作:

var separators = [' ', '+', '(', ')', '*', '\\/', ':', '?', '-'];
var tokens = x.split(new RegExp('[' + separators.join('') + ']', 'g'));​​​​​​​​​​​​​​​​​

生成的正则表达式将使用正则字符类:/[ +()*\/:?-]/g

这样您就不需要转义任何内容。


可以提供一个 var x 的示例吗? - anubhava
var arr = str.split(new RegExp('[|!=&+- ]', 'g'));- 错误 - nim

9
以下是更简单的实现方式。
var tokens = x.split(new RegExp('[-+()*/:? ]', 'g'));​​​​​​​​​​​​​​​​​

请注意,- 必须放在第一位(或进行转义),否则它将被认为是 range 运算符(例如 a-z)。

2

我认为您需要转义 +、* 和 ?,因为它们在大多数正则表达式语言中具有特殊意义。


1

如果您想基于多个正则表达式进行切割,并且不想编写一个复杂的正则表达式,您可以使用 replacesplit。像这样:

const spliters = [
 /(\[products\])/g,
 /(\[link\])/g,
 /(\[llinks\])/g,
];
let newString = "aa [products] bb [link] [products] cc [llinks] dd";
spliters.forEach(regex => {
 newString = newString.replace(regex, match => `æææ${match}æææ`);
});
const mySplit = newString.split(/æææ([^æ]+)æææ/)
console.log(mySplit);

这对我的情况非常有效。

1
这是因为正则表达式中像+*这样的字符具有特殊含义。 将连接符从|改为|\,并转义字面量即可解决问题。

当我将其更改为|\时,出现错误'Uncaught SyntaxError: Unexpected token ;'。我认为这是因为在引号内输入|\时,引号被转义了。如何避免这种情况? - Okky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接