iphone14的safari和windows/android对正则支持不一样?

我在quickadd里,用到这个函数的正则:

    var lineformat = (line) => {
	    //处理连接,不转义替换
        line = line.replace(/\[\[([^\[\]|]+)\]\]/g,(_, group1) => `[[${group1.replace(/\*|\+|\_|\$|%|\<|`|\\|-/g, 'DISCOURSE_PLACEHOLDER_1LDQMark')}]]`);
        line = line.replace(/\[\[([^\[\]|]+)\|([^\[\]|]+)\]\]/g,(_, group1,group2) => `[[${group1.replace(/\*|\+|_|\$|%|\<|`|\\|-/g, 'DISCOURSE_PLACEHOLDER_1LDQMark')}|${group2}]]`);
        //改为同[[url|title]]
        line = line.replace(/\(\(([^()|]+)\|([^()|]+)\)\)/g, (_, group1, group2) => `[${group2}](${group1.replace(/\*|\+|_|\$|%|\<|`|\\|-/g, 'DISCOURSE_PLACEHOLDER_1LDQMark')})`);
        line = line.replace(/\(\(([^()|]+)\|\)\)/g, (_, group1) => `[[${group1.replace(/\*|\+|_|\$|%|\<|`|\\|-/g, 'DISCOURSE_PLACEHOLDER_1LDQMark')}]]`);
        // **abc
        line = line.replace(/(?<!\*)(\*\*)(?!\*)/g, (match, group1) => group1.replace(/\*/g,'DISCOURSE_PLACEHOLDER_1LDQMark'));
        // 不使用%%注释
        line = line.replace(/(%%+)/g,match => match.replace(/%/g,'\\%'));
        // 对html标记,不替换<
        line = line.replace(/\<(?=[^<>]+>)/g,"<LDQMark");
        // 行首的*-+ 不替换,实际上这三种字符的序列符号都是黑圆点
        line = line.replace(/^\s*(\+|-|\*)\s+/g,match => match.replace(/\+|-|\*/g,'DISCOURSE_PLACEHOLDER_1LDQMark'));
		// 转义替换
        line = line.replace(/\\(?!(\*|\+|\[|_|\$|%|\<|`|\\|-|n))/g, "\\\\");
		line = line.replace(/(?<!\\)\*(?!LDQMark)/g, "\\*");
		// 使用$fdfj$标记不着色斜体,$...$是latex公式
        // line = line.replace(/(?<!\\)\$(?!LDQMark)/g, "\\$");
        line = line.replace(/(?<!\\)\<(?!LDQMark)/g, "\\<");
        // 不使用下划线表示着色斜体
        line = line.replace(/(?<!\\)_(?!LDQMark)/g, "\\_");
        // 改为用/*   */ 表示斜体
        line = line.replace(/\/\\\*/g,"*");
        line = line.replace(/\\\*\//g,"*");
        // quickadd不知为什么把\n的文本都当作是换行输出
        line = line.replace(/\\n/g, "\\%LDQHideFH%n");
        // 去掉所有的LDQMark
        line = line.replace(/LDQMark/g,"");
        return line;
     }

这在windows和安卓都是正常的,但在ios(一台前2年买的iphone14)上,则是语法错误:
SyntaxError: Invalid regularexpression: invalid groupspecifer name

我对ios的开发完全不懂,请同学位帮我看看问题出在哪里,如何简单修改,让兼容三个平台吗?

问题可能出在那几个复杂的 “反向预搜索” 写法, 即 ?<!xxxx (以及 ?<=xxxx 估计也不行)
“regular expression” | Can I use… Support tables

但我不能完全确定 iOS 版的在 Ob QuickAdd 里运行的脚本, 跟 iOS Safari 是不是有关联


如何简单修改

试试别用这个语法, 简单情况能找到 (?<!\*) 的替代品, 比如改成 ([^\*]) 注意此时这个组就真的捕获了, 替换时得原封不动写回去, 且所有组号要往后错一位

复杂情况, 可能得在 replace 里写函数

是的,确实不支持0宽断言。

已用反复替换法改写了,但未有机会在iphone上测试,手机不在我手上,等周末我测试下除0宽断言外还有无报错。

1 个赞