亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

否定后視不匹配轉義字符,在轉義反斜杠上失敗

否定后視不匹配轉義字符,在轉義反斜杠上失敗

元芳怎么了 2021-09-04 17:18:40
假設我想在任何分隔符字符處拆分字符串,但不是轉義字符,我通??梢允褂秘摵笠暫?string.split(regex)。例如:const regex = /(?<!\\)\,/;'abc,def'.split(regex); 'abc\\,def'.split(regex); 在,in處拆分abc,def,但不在 in處拆分abc\,def。這可以!但是,如果分隔符本身是一個反斜杠,則負向后視似乎無法按預期工作:const regex = /(?<!\\)\\/;'abc\\def'.split(regex); 'abc\\\\def'.split(regex); \在abc\defAND 中的第一個分開abc\\def。我天真地以為否定的lookbehind 與\前面的a不匹配\。參見:https : //regex101.com/r/ozkZR1/1如何在任何非轉義字符處實現 string.split(regex) ,這些字符不會因反斜杠或換行符等特殊字符而分崩離析(人們也應該能夠轉義它們)?
查看完整描述

2 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

天真的解決方案

在分隔符與分隔符相同的情況下,您可以在分隔符之后進行否定前瞻,在否定后看的基礎上:

/(?<!\\)\\(?!\\)/

注意事項

這種方法有很多問題,我不建議用正則表達式解決它,我特別不建議讓分隔符和轉義字符相同。

  • 隨著,作為分隔符,在一場結束文字字符會愚弄正則表達式,比如,abc\\,def不會得到分裂。

  • 隨著\作為分隔符和轉義字符,你不能有空白字段:abc,,def將三個字段,包括空單,但abc\\def將只是一個字段。

  • 怎么樣abc\\\def?\在第一個字段的末尾或第二個字段的開頭是否有文字?無論哪種方式,我的正則表達式都不會分裂。

如果您愿意在邊界處字面上禁止使用轉義字符,并且不允許使用空字段,那么當轉義符和分隔符相同時,我的正則表達式將起作用,而在另一種情況下,您的正則表達式將起作用。

否則,我會推薦一個不同的解決方案,從左到右解析字符串,在遇到轉義符時解釋轉義符,并在看到未轉義的分隔符時abc\\,def進行拆分,以便正確拆分。


查看完整回答
反對 回復 2021-09-04
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

解決方案是反轉操作:


我可以查找分隔字符序列,而不是查找分隔符。因此,在,分隔符的情況下,我會尋找:((\\,)|[^,])([^,]*?(\\,)?)*: 轉義逗號或非逗號字符,后跟任意數量(可能為空)的非逗號組(不情愿,因此它不會捕獲\轉義符)后跟一個可選的轉義逗號。


let separator = ','; // get from sanitized input

separator = separator === '\\' ? '\\\\' : separator;

const groups = new RegExp(`((\\\\${separator})|[^${separator}])([^${separator}]*?(\\\\${separator})?)+`, 'g');

let columns = line.match(groups);

這既,適用\于分隔符,也適用于分隔符,不會分別拆分\,和拆分\\。


該表達式中最難的部分是將所有的轉義都弄對。


查看完整回答
反對 回復 2021-09-04
  • 2 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號