正则表达式仅替换一个匹配项

问题描述

我有一个JavaScript正则表达式代码

const regexns = /[A-Za-z]\:[A-Za-z]/gi;
data = data.replace(regexns,'__NS__');

如果我对此XML申请

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="com.zigma.Controller">

我明白了

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmln__NS__x="http://javafx.com/fxml/1"
    f__NS__ontroller="com.zigma.Controller">

这意味着我在:的下一个和上一个字母前放了1个字母

如何替换:而又不丢失副字母,
正则表达式本身是否有任何选择,还是我们需要执行循环和条件并像这样拆分?

预期输出为

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns__NS__fx="http://javafx.com/fxml/1"
    fx__NS__controller="com.zigma.Controller">

解决方法

捕获:之前的字母,以便可以将其添加到替换中,并提前查找:之后的字母,以使其不匹配。还要注意,由于您使用的是不区分大小写的标志,因此无需重复[A-Za-z],并且不需要对冒号进行转义:

const data = `<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="com.zigma.Controller">
    `;
console.log(data.replace(/([a-z]):(?=[a-z])/gi,'$1__NS__'));

根据输入的形状,您可能可以改为使用单词边界:

const data = `<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="com.zigma.Controller">
    `;
console.log(data.replace(/\b:\b/gi,'__NS__'));

对于更强大的功能,我建议将字符串解析为XML文档,然后遍历文档的元素,用新属性替换包含:模式的属性。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...