【问题标题】:Split string in JavaScript using regex with zero width lookbehind使用正则表达式在 JavaScript 中拆分字符串,后向宽度为零
【发布时间】:2014-08-29 02:44:19
【问题描述】:

我知道 JavaScript 正则表达式有原生的前瞻,但没有后瞻。

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

在ເ、ແ、ໂ、ໃ、ໄ 之前拆分。在ະ 之后拆分。

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

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

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

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

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

但我想不出模拟零宽度后视的通用方法

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 比我的回答干净得多。 +1。
    【解决方案2】:

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

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

    然后使用前瞻再次拆分数组中的元素。

    【讨论】:

    • RegExp.prototype.exec 在网络上某些浏览器中的实现不一致,通常首选String.prototype.match
    • @hwnd 我可以知道在什么情况下上述正则表达式会失败。
    【解决方案3】:

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

    "ເລື້ອຍໆມະຫັດສະຈັນເອກອັກຄະລັດຖະທູ".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(/(?=[ໃໄໂເແ])/));},[]);
    

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

    【讨论】:

    • 在第一次通过之前先通过前瞻部分?这就是我现在正在玩的东西(-:...
    • 此解决方案存在一种不通用的方法。如果“结束”模式可以是不同数量的字符。这在我当前的迭代中不会发生,但将来可能会发生,并且更通用的解决方案会更好(-:......然后我再次在我的问题中指定了“字符”。
    • 我不明白这有什么关系。拆分模式也可以很容易地成为一种替代方式……无论每种情况下的实际分隔符是什么,它仍将被包含并附加到前一个字符串中。
    • 你是对的。我以为我在 ະ 的长度上看到了硬编码的东西,但没有。
    猜你喜欢
    • 2011-01-25
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多