使用正则表达式为零的正则表达式在JavaScript中拆分字符串

时间:2014-08-29 02:44:20

标签: javascript regex regex-lookarounds string-split lookbehind

我知道JavaScript正则表达式具有本机前瞻功能,但不具有外观。

我想在以一组字符的任何成员开头或以另一组字符的任何成员结尾的点处拆分字符串。

之前拆分。在之后拆分。

In: ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູດ

Out: ເລື້ອຍໆມະ ຫັດສະ ຈັນ ເອກອັກຄະ ລັດຖະ ທູດ

我可以使用零宽度前瞻实现“拆分前”部分:

'ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູດ'.split(/(?=[ໃໄໂເແ])/)

["ເລື້ອຍໆມະຫັດສະຈັນ", "ເອກອັກຄະລັດຖະທູດ"]

但我想不出模拟零宽度后视的一般方法

我正在拆分任意Unicode文本的字符串,所以不想substitute in special markers in a first pass,因为我不能保证输入中没有任何字符串。

3 个答案:

答案 0 :(得分:2)

您可以考虑使用match()方法,而不是split

var s = 'ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູດ',
    r = s.match(/(?:(?!ະ).)+?(?:ະ|(?=[ໃໄໂເແ]|$))/g);

console.log(r); //=> [ 'ເລື້ອຍໆມະ', 'ຫັດສະ', 'ຈັນ', 'ເອກອັກຄະ', 'ລັດຖະ', 'ທູດ' ]

答案 1 :(得分:1)

如果在分隔的正则表达式中使用括号,则捕获的文本将包含在返回的数组中。因此,您可以在/(ະ)/上拆分,然后将结果数组的每个奇数成员连接到前面的偶数成员。例如:

"ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູ".split(/(ະ)/).reduce(function(arr,str,index) {
   if (index%2 == 0) { 
     arr.push(str); 
   } else { 
     arr[arr.length-1] += str
   }; 
   return arr;
 },[])

结果:["ເລື້ອຍໆມະ", "ຫັດສະ", "ຈັນເອກອັກຄະ", "ລັດຖະ", "ທູ"]

你可以在前瞻上再做一次分裂:

"ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູ".split(/(ະ)/).reduce(function(arr,str,index) {
   if (index%2 == 0) { 
     arr.push(str); 
   } else { 
     arr[arr.length-1] += str
   }; 
   return arr;
 },[]).reduce(function(arr,str){return arr.concat(str.split(/(?=[ໃໄໂເແ])/));},[]);

结果:["ເລື້ອຍໆມະ", "ຫັດສະ", "ຈັນ", "ເອກອັກຄະ", "ລັດຖະ", "ທູ"]

答案 2 :(得分:1)

你可以尝试匹配而不是分裂,

> var re = /((?:(?!ະ).)+(?:ະ|$))/g;
undefined
> var str = "ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູດ"
undefined
> var m;
undefined
> while ((m = re.exec(str)) != null) {
... console.log(m[1]);
... }
ເລື້ອຍໆມະ
ຫັດສະ
ຈັນເອກອັກຄະ
ລັດຖະ
ທູດ

然后再使用lookahead分割数组中的元素。