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

时间:2020-08-29 15:35:29

标签: javascript regex xml-namespaces

我有一个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">

1 个答案:

答案 0 :(得分:2)

捕获:之前的字母,以便可以将其添加到替换中,并提前查找:之后的字母,以使其不匹配。还要注意,由于您使用的是不区分大小写的标志,因此无需重复[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文档,然后遍历文档的元素,用新属性替换包含:模式的属性。