2 回答
TA貢獻1827條經驗 獲得超9個贊
天真的解決方案
在分隔符與分隔符相同的情況下,您可以在分隔符之后進行否定前瞻,在否定后看的基礎上:
/(?<!\\)\\(?!\\)/
注意事項
這種方法有很多問題,我不建議用正則表達式解決它,我特別不建議讓分隔符和轉義字符相同。
隨著
,作為分隔符,在一場結束文字字符會愚弄正則表達式,比如,abc\\,def不會得到分裂。隨著
\作為分隔符和轉義字符,你不能有空白字段:abc,,def將三個字段,包括空單,但abc\\def將只是一個字段。怎么樣
abc\\\def?\在第一個字段的末尾或第二個字段的開頭是否有文字?無論哪種方式,我的正則表達式都不會分裂。
如果您愿意在邊界處字面上禁止使用轉義字符,并且不允許使用空字段,那么當轉義符和分隔符相同時,我的正則表達式將起作用,而在另一種情況下,您的正則表達式將起作用。
否則,我會推薦一個不同的解決方案,從左到右解析字符串,在遇到轉義符時解釋轉義符,并在看到未轉義的分隔符時abc\\,def進行拆分,以便正確拆分。
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);
這既,適用\于分隔符,也適用于分隔符,不會分別拆分\,和拆分\\。
該表達式中最難的部分是將所有的轉義都弄對。
添加回答
舉報
