微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决正则表达式仅替换一个匹配项

我有一个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文档,然后遍历文档的元素,用新属性替换包含:模式的属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。